C++面向对象多态之虚析构函数和纯虚函数
程序员文章站
2024-03-17 16:08:52
...
虚析构函数
如果存在父类指针指向子类对象的情况,应该将析构函数声明为虚函数(虚析构函数)
delete父类指针(如下面代码的cat指针)时,才会调用子类的析构函数,保证析构的完整性
#include <iostream>
using namespace std;
struct Animal {
virtual void speak() {
cout << "Animal::speak()" << endl;
}
virtual void run() {
cout << "Animal::run()" << endl;
}
Animal() {
cout << "Animal构造::Animal()" << endl;
}
~Animal() {
cout << "Animal析构::Animal()" << endl;
}
};
struct Cat : Animal {
void speak() {
cout << "Cat::speak()" << endl;
}
void run() {
cout << "Cat::run()" << endl;
}
Cat() {
cout << "Cat构造::Cat()" << endl;
}
~Cat() {
cout << "Cat析构::~Cat()" << endl;
}
};
int main() {
Animal *cat = new Cat();
cat->speak();
cat->run();
delete cat;
getchar();
return 0;
}
运行结果
优化
只要父类的析构是虚函数,那子类的析构也是虚函数,虽然名字不同 。
纯虚函数(类似于其他语言如PHP、Java中的接口)
纯虚函数:没有函数体且初始化为0的虚函数,用来定义接口规范
写法(speak和walk就是纯虚函数,animal类就是抽象类)
抽象类(Abstract Class)
含有纯虚函数的类,不可以实例化(不可以创建对象)
抽象类也可以包含非纯虚函数、成员变量
如果父类是抽象类,子类没有完全重写纯虚函数,那么这个子类依然是抽象类(判断依据:实例化检查一下)
上一篇: Python-函数进阶
下一篇: 面向对象 --- 多态