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();

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值