继承与组合的选择

1)          继承与组合是重用对象代码的机制。

2)          关于父子类的初始化,请参考初始化列表

http://blog.csdn.net/yeming81/archive/2010/06/16/5673560.aspx

3)          不能继承的函数

l       构造函数和析构函数

构造函数与析构函数只负责它所在的那一层上的构建与释放。子类仍然需要自己的构造函数,也需要手动调用父类的自定义构造函数。

l       operator=

理由同上。

 

4)          new/delete是可以被继承的

当在父类定义了new/delete时,如果子类没有重载new/delete,则用父类的。

5)          static函数也是可以继承的,但其不能是virtual的。

public A

{

public:

static int Func(){return 1;}
};

           

         class B:public A

         {

                   

         };

         B::Func(); //可以

 

更多请参考

http://blog.csdn.net/yeming81/archive/2010/05/31/5637717.aspx

 

6)          组合的需求

l       当需要存在的类功能时,可选择组合或继承。当不想用存在类的接口,而完全使用新类定义的接口时,用组合。

l       当不需要从子类到父类的转换时,考虑用组合。

比如,你只是用vector保存一些数据时,就不需要这种转换。

7)          private/protected继承的需求

l       private继承是实现继承,在一般情况下,用组合可满足需求。但是,当子类需要父类的部分功能时,可考虑用私有继承

class A

{

public:

void Func1();

void Func2();
};

           

          class B: private A //不写private默认就是私有继承

          {

                public:

                   using A::Func1; //Func1公有。

          };

l       私有继承时,父子类指针不能进行转换,因为它们没有关系。

A* pA = new B;

l       protected继承的出现只是为了语言的完备性

8)          继承的需求 多态

请参考

http://blog.csdn.net/yeming81/archive/2010/06/16/5673139.aspx

 

9)          父子类之间的转换

l       向上类型转换

从子类到父类的转换是安全的,因为它仅仅是失去一些子类的功能

l       向下类型转换

相反,从父类到子类的转换是非安全的,因为它增加了一些功能

           

       从以上可反映出生活的哲理:失去的比得到的更加容易。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值