C++学习笔记 35 虚析构函数

一、虚析构函数的使用场景

  1. 父类引用指向子类对象,子类对象的析构函数不能被调用,只有父类的可以被调用

二、virtual函数

  1. 普通方法前标记为virtual, 那么它就可以被覆写,那么这就意味着要做虚函数表这样的设置。
  2. 析构函数不一样,virtual 析构函数, 不是覆写析构函数,而是加上一个析构函数。
  3. 如果把基类析构函数标记为virtual,则实际上会调用2个析构函数。先调用派生类的,再调用基类的。

三、代码

#include<iostream>

class Base {
public:
	Base() { std::cout << "Base() \n"; }
	~Base() { std::cout << "~Base() \n"; }
	//virtual ~Base() { std::cout << "~virtual Base() \n"; }
};

class Son : public Base {
private:
	int* arr;
public:
	Son() { 
		arr = new int[10]; 
		std::cout << "Son() \n"; 
	}
	~Son() { 
		delete[] arr; 
		std::cout << "~Son() \n"; 
	}
};

void testVirtualDestructor() {
	Base* base = new Base();
	delete base;
	std::cout << "------------------------\n";

	Son* son = new Son();
	delete son;
	std::cout << "------------------------\n";

	Base* son2 = new Son();
	delete son2;
	std::cout << "------------------------\n";
}

int main() {
	testVirtualDestructor();
}
  1. 基类虚构函数不带virtual
Base()
~Base()
------------------------
Base()
Son()
~Son()
~Base()
------------------------
Base()
Son()
~Base()
------------------------
  1. 基类虚构函数带virtual
Base()
~virtual Base()
------------------------
Base()
Son()
~Son()
~virtual Base()
------------------------
Base()
Son()
~Son()
~virtual Base()
------------------------
------------------------

四、总结

当写一个要拓展的类或子类时,这一点非常重要,只要你允许一个类拥有子类,你需要百分之一百的声明其析构函数为虚函数,否则没人能安全的拓展这个类,包括你自己也不能。

posted @ 2025-12-23 21:05  超轶绝尘  阅读(1)  评论(0)    收藏  举报