//纯虚函数 没有函数体的函数
class A{
private:
int a;
public:
virtual void Print() = 0;//纯虚函数
void fun(){
cout<<"fun"<<endl;
}
};
//包括纯虚函数的类就是抽象类
//只能作为基类来派生新类使用
//不能创建抽象类的对象
//抽象类的指针和引用->由抽象类派生出来的类和对象(多态)
A a;//error 抽象类不能创建对象
A *pa;//ok 可以定义抽象类的指针和引用
pa = new A;//error A抽象类不能创建对象
//抽象类中在成员函数内可以调用纯虚函数
//在构造函数/析构函数 内部不能调用纯虚函数
//如果一个类从抽象派生而来 它实现了该类中所有纯虚函数 才能成为非抽象类
class A{
private:
int a;
public:
virtual void Print() = 0;//纯虚函数
void fun(){
cout<<"fun"<<endl;
}
};
//包括纯虚函数的类就是抽象类
//只能作为基类来派生新类使用
//不能创建抽象类的对象
//抽象类的指针和引用->由抽象类派生出来的类和对象(多态)
A a;//error 抽象类不能创建对象
A *pa;//ok 可以定义抽象类的指针和引用
pa = new A;//error A抽象类不能创建对象
//抽象类中在成员函数内可以调用纯虚函数
//在构造函数/析构函数 内部不能调用纯虚函数
//如果一个类从抽象派生而来 它实现了该类中所有纯虚函数 才能成为非抽象类
//虚析构函数
//针对解决这个问题:通过基类的指针删除派生类的对象时,只调用基类的析构函数
class CSon{
public:
~CSon(){
cout<<"child";
};
};
class CGrandson:Cson{
public:~CGrandson(){
cout<<"child";
};
};
int main(){
CSon *p = new CGrandSon;
delete p;//删除p时候 删除基类对象 不会删除子类的对象
return 0;
}
//解决方案: 删除一个派生类对象时候
//先调用派生类的析构函数
//在调用基类的析构函数
//把基类的析构函数声明virtual
//派生类的析构函数 virtual可以不进行声明
//通过基类的指针删除派生类的对象;
//首先调用派生类的析构函数
//然后调用基类的析构函数
//如果定义了虚函数 则最好将析构函数也定义为虚函数
//不允许虚函数做为构造函数
//析构函数 为虚函数 delete pson;//相当于多态 执行pson指向对象的析构函数 也就是子类析构函数
//子类析构函数执行 引发父类析构函数的执行