欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

运行结果
C++面向对象多态之虚析构函数和纯虚函数

优化

C++面向对象多态之虚析构函数和纯虚函数
C++面向对象多态之虚析构函数和纯虚函数
只要父类的析构是虚函数,那子类的析构也是虚函数,虽然名字不同 。

纯虚函数(类似于其他语言如PHP、Java中的接口)

纯虚函数:没有函数体且初始化为0的虚函数,用来定义接口规范
写法(speak和walk就是纯虚函数,animal类就是抽象类)
C++面向对象多态之虚析构函数和纯虚函数

抽象类(Abstract Class)

含有纯虚函数的类,不可以实例化(不可以创建对象)
抽象类也可以包含非纯虚函数、成员变量
如果父类是抽象类,子类没有完全重写纯虚函数,那么这个子类依然是抽象类(判断依据:实例化检查一下)
C++面向对象多态之虚析构函数和纯虚函数
C++面向对象多态之虚析构函数和纯虚函数