C/C++程序员面试秘笈——7.继承和多态

私有继承方式

私有继承中,不允许将子类对象转换成父类对象

 

私有继承子类和父类不是is a 的关系,而是is implement in terms of(以...实现)

 

 

 

组合与私有继承

 

有一个(has a)关系,单一组合可以与私有继承替换

 

区别:

 

继承可能引入不必要的多重继承

 

继承允许子类指针到父类指针的转换,允许子类重写父类虚函数,允许子类访问父类protected成员

 

选择:尽可能使用组合

 

 

 

 

 

构造函数中调用虚函数

 

当父类构造函数运行时,子类数据成员还没有被初始化,因此虚函数会直接执行父类的函数

 

虚函数调用参数问题

class Base

{

public:

virtual void g(int i = 10) {cout << i << endl;}

}

class Derived:public Base

{

public:

virtual void g(int i = 20) {cout << i << endl;}

}

Base *pb = new Derived;

pb->g();

输出10,由于参数的值在编译期就已经决定。

 

 

 

多重继承中虚函数表结构

class Base1

{

virtual void foo1();

virtual void foo2();

virtual void foo3();

}

class Base2

{

virtual void foo1();

virtual void foo2();

virtual void foo3();

}

class Base3

{

virtual void foo1();

virtual void foo2();

virtual void foo3();

}

class Derived4 : public Base1, public Base2, public Base3

{

virtual void foo1();  //覆盖Base1::foo1, Base2::foo1, Base3:;foo1

virtual void foo();

}

 

 

C/C++程序员面试秘笈——7.继承和多态