标签:
构造函数与继承:
(1)构造函数和复制控制成员不能继承,每个类定义自己的,要是没定义就用合成的。
对于基类来说:
(1)基本没啥影响,若是只希望派生类来使用,可以定义为protected。
对于派生类来说:
(1)派生类构造函数除了初始化自己的成员外,还要初始化基类(这个先进行)。
(2)若是合成的派生类默认构造函数,它将先调用基类的合成默认构造函数,再接着根据常规变量初始化自己的。
(3)定义默认构造函数时的初始化列表可以只写派生类的,会自动隐含的调用基类的。
(4)不能直接初始化继承类的成员,但是可以显式的在构造函数初始化列表中调用继承类的构造函数,从而传递实参。
(5)在派生类中只能初始化*直接基类*。
复制控制与继承:
(1)定义派生类的复制构造函数。
若是派生类定义自己的复制构造函数那么应该显式的调用基类的复制构造函数。不然就会基类部分使用默认的。
derive(const &derive d):base(d){。。。}
在这里base(d)将会将派生类对象d转换为基类对象的引用,并调用基类复制构造函数,来对基类部分赋值。
derive(const &derive d){。。。}
这样会调用基类的默认构造函数,而派生类部分还是一样的。那么最后对象就很奇怪了。一部分默认值,一部分是d的值。
(2)对于派生类的赋值操作符与上面情况类似。
(3)派生类的析构函数。
每个析构函数只负责清除自己的成员。
对象撤销顺序与构造顺序相反。
虚析构函数:
(1)若基类指针实际指向的类型对象是派生类,如果析构函数不是虚函数,那么行为将未定义,所以
在继承中析构函数一定要定义为虚析构函数。
(2)构造函数不能定义为虚函数
构造函数是在对象完全构造之前运行的,而这个时候对象的动态类型都不完整。
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4734367.html