构造函数 析构函数 的继承与虚拟问题 & 虚函数 纯虚函数
构造函数:可以被继承,不能是虚拟的。
1.如果基类中无构造函数,子类中可不定义构造函数,均使用默认的构造函数。
2.如果基类中有无参构造函数,子类中可不定义构造函数,继承基类的无参构造函数。
3.如果基类中只有带参数的构造函数,子类中必须继承基类构造函数,并传递参数初始化。
派生类构造函数构造顺序:
1.调用基类构造函数。
2.调用内嵌对象所在类的构造函数。
3.调用派生类的构造函数。
比如:
class Base
{
public:
Base()
{
cout<<"base构造函数"<<endl;
}
~Base()
{
cout<<"base析构"<<endl;
}
};
class DDD
{
public:
DDD()
{
cout<<"DDD构造"<<endl;
}
~DDD()
{
cout<<"DDD析构"<<endl;
}
};
class Son:public Base
{
private:
DDD d;
public:
Son()
{
cout<<"son构造"<<endl;
}
~Son()
{
cout<<"son析构"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Son* s=new Son;
delete s;
system("pause");
return 0;
}
执行结果:
base构造函数
DDD构造
son构造
son析构
DDD析构
base析构
析构函数:默认的完全继承,最好是虚拟的。
虚函数与纯虚函数:
因为通常是通过基类的指针去析构一个对象,定义为virtual,可以去执行子类的构造函数。
纯虚函数是在基类中声明的函数,在函数形参表后加=0;
含有纯虚函数的类成为抽象基类,不能被实例化,必须在所有派生类中实现纯虚函数。
只包含虚函数的基类不能成为抽象类。

浙公网安备 33010602011771号