私有继承方式
私有继承中,不允许将子类对象转换成父类对象
私有继承子类和父类不是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();
}