最美的司机,京东金条怎么开通,曹祖民
从这一章开始,我们将阅读到有关程序设计的条款。
如果你之前是其他程序的编写者,要做好对C++特色OOP与众不同的准备。你将对OOP的概念产生变化。
子类对象 即 是一个 父类对象
derived class object IS A base class object
考虑以下代码:
void eat( const Person& p ); void study( const Student& s ); Person p; Student s; eat( p ); // OK eat( s ); // OK study( s ); //OK study( p ); // ERR 人不一定是学生,但你又无法阻止用户这么去做。
而在面向对象中,你可以通过继承关系来扩大缩小对象的行为个数。 之后的矩形与正方形的关系也与该例类似。
考虑以下继承关系:
class Bird { public: virtual void fly(); // 鸟可以飞 ... }; class Penguin : public Bird { // 企鹅是一种鸟 ... };
突然之间我们遇见了乱流,企鹅确实是一种鸟,但他不能飞。
在这个例子中,我们成了不严谨语言(英语)的牺牲品。我们一般说的鸟会飞是指一部分鸟会飞,而相当一部分鸟是不会飞的。
修改成如下继承关系。
class Bird { ... }; class FlyingBird : public Bird { public: virtual void fly(); ... }; class Penguin : public Bird { ... };
但如果你的重点不在鸟会不会飞的时候,这样做显得冗余,这时下第一种情况显得更加合乎完美一些。
void error( const std::string& msg ); class Penguin : public Bird { public: virtual void fly() { error( "Attempt to make a penguin fly!" ) } // 运行时错误 };
class Bird { ... }; class Penguin : public Bird { ... }; Penguin p; p.fly(); // 编译时错误
好的接口可以防止无效的代码通过编译(条款18),因此宁可采取第二种方法也不要使用“只在运行时期才能侦测他们”的设计。
请记住
”public继承“意味着is-a。适用于父类身上的每一件事情也一定也适用于子类,因为每一个子类对象也都是一个父类对象。
is-a has-a is-implemented-in-terms-of
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论