作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] OOP继承
时间Fri May 8 11:33:58 2009
※ 引述《phdch (我们都活在这个城市里面)》之铭言:
: 下面程式码
: class Apple:public Fruit
: 中的修饰词public
: 我知道是存取权限多少的关系
: class中的public成员,private成员,我理解
: 但public的类别(Fruit)要怎麽解释与子类别(Apple)的关系最好呢???
: 感谢
简单的说法是「Apple 是一种 Fruit」 (Apple is-a Fruit)
但其实这样的说法可能会引人误解,
因为在 OOP 中,「is-a」和一般人对「是一个...」或「属於...」的认知有一点不同
在 OOP 中,Apple is-a Fruit 意指所有对父类别 (Fruit) 的操作,都可以
运用在子类别 (Apple) 身上。比如说 Fruit 提供了 taste() 这个成员函式,
可以传回该水果尝起来的味道,那麽 Apple 也有义务提供 taste() 这个函
式,显示出苹果的味道如何。
class Fruit {
public:
virtual string taste() = 0;
};
class Apple : public Fruit {
public:
virtual string taste()
{
return "Apple is sweat.";
}
};
这样的好处是,对於不同种类的水果,我们都可以用相同的操作去显示它的味道:
class Lemon : public Fruit {
public:
virtual string taste()
{
return "Lemon is sour."; // 柠檬很酸
}
};
class ArtificialFruit : public Fruit { // 某种人造水果
public:
virtual string taste()
{
string result;
... // 进行某些复杂的运算来得到它的味道
return result;
}
};
void print_taste(Fruit& fruit)
{
// 我不知道 fruit 是什麽水果
// 但我知道,只要是 Fruit,就可以用 taste() 取得它的味道
cout << fruit.taste() << endl;
}
int main()
{
Apple apple;
Lemon lemon;
ArtificialFruit unknow;
// apple is-a Fruit
// Fruit 提供 taste() 来取得水果的味道
// 所以 apple 也可以用 taste() 来取得味道
print_taste(apple);
print_taste(lemon); // 同上,印出柠檬的味道
print_taste(unknow); // 同上,印出某种未知的味道
return 0;
}
不管你发明怎样的水果,只要这种水果提供 taste() 界面,那你不需要修改
既有的 print_taste 程式码,就可以印出该水果的味道。这正是 OOP 中最
基本的概念。
至於 private inheritance,在概念上和 public inheritance 有极大的不同,
它并不会形成 is-a 的关系,而比较类似 has-a。如果你对这些议题有兴趣,
建议你可以看看以下的参考资料:
* Effective C++ 条款 35:确定你的 public inheritance 模塑出 is-a 的关系
条款 36:区分介面继承及实作继承
条款 42:明智地运用 private inheritance
* Exceptional C++ 条款 22:class 设计的常见错误
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.87.151.2
1F:推 VictorTom:推:) 小弟今天负责来推文的就对了XD 05/08 12:38
2F:推 Peruheru:这篇文章真有趣 05/08 12:38
3F:推 akasan:推~不过到现在还没实际用过public继承以外XD 05/08 15:37
4F:→ tinlans:关键字:LSP 05/08 21:50
5F:推 softwind:好文(好闻) 推一个 05/08 22:29