//###########################################################################
/*
* 公有继承的两元性
*
* - 接口的继承
* - 实现的继承
*/
class Dog {
public:
virtual void bark() = 0; //只继承了接口
void run() { cout << "I am running."; } //既继承了接口,也继承了实现
virtual void eat() { cout << "I am eating. "; }
protected:
void sleep() { cout << " I am sleeping. "; } //只继承了实现,没继承接口
};
class Yellowdog : public Dog{
public:
virtual void bark() { cout << "I am a yellow dog.\n";}
void iSleep() { sleep(); }
};
/*
* C++中继承的类型:
* 1. 纯虚公有函数 - 只继承接口
* 2. 非虚公有函数 - 继承接口和实现
* 3. 非纯虚公有函数 - 继承接口和默认实现
* 4. 保护函数 - 只继承实现
*
* 作为程序设计师,有必要分清接口和实现的概念
*/
/*
* 接口继承用于
*
* 1. Subtyping
* 2. Polymorphism
*/
virtual void bark() = 0;
/*
* 陷阱:
* -- 小心接口膨胀
* -- 接口不应该显示实现
*/
/*
* 实现继承
* - 会增加代码的复杂性 //在写派生类的时候需要关注基类,在改基类的时候的还要时刻小心有没有破坏派生类
* - 不鼓励Not encouraged
*/
public:
void run() { cout << "I am running."; }
virtual void eat() { cout << "I am eating. "; }
protected:
void sleep() { cout << " I am sleeping. "; }
/*
* 实现继承的指导原则:
* 1. 不要为了代码重用而使用继承,使用组合替代
* 2. 最小化基类的实现,基类要小巧
* 3. 最小化实现继承的层数
*/
/*
* 继承是否是魔鬼 ???
*
* 继承有时候有用,但是往往过度使用了
*/