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 向下类型转换
相反,从父类到子类的转换是非安全的,因为它增加了一些功能
从以上可反映出生活的哲理:失去的比得到的更加容易。