多态的代价

文章讨论了静态继承中构造函数和析构函数的执行顺序,以及在动态内存分配下,非虚析构函数可能导致内存泄漏的问题。解决方法是将析构函数设为虚函数以确保正确执行派生类的内容。
摘要由CSDN通过智能技术生成

静态继承

基类和派生类是占一块空间,派生类在实例化时,是从上往下,是先实现基类的构造函数,后实现派生类的构造函数,例如

class T
{
    public:
        T()
        {
            this.print();
        }
        virtual void print()
        {
            //T的内容
        }
};
class T2
{
    public:
        T2()
        {
            this.print();
        }
        void print() override
        {
            //T2的内容
        }
};

此时是先执行T的构造函数,因为T2还没创建,所以此时虚构函数依旧是//T的内容,而后是T2的内容,所以打印的顺序是

 //T的内容

 //T2的内容

析构函数

但如果是析构函数

class T
{
    public:
        ~T()
        {
            this.print();
        }
        virtual void print()
        {
            //T的内容
        }
};
class T2
{
    public:
        ~T2()
        {
            this.print();
        }
        void print() override
        {
            //T2的内容
        }
};

因为回收是从派生类开始的,当派生类执行析构函数后已经被回收,此时到基类的析构函数时,因为T2被回收,所以他只能执行T1中虚函数的内容。

但如果动态分配内存时

#include<iostream>

class T
{
public:
	~T()
	{
		this->print();
	}
	
	virtual void print()
	{
		std::cout << "class T\n";
	}
};
class T2 :public T
{
public:
	~T2()
	{
		this->print();
	}
	
	void print() override
	{
		std::cout << "class T2\n";
	}
};
int main()
{
	T* t2 = new T2();
	t2->print();
}

就会出现析构时只调用T析构函数的内容,则是因为析构函数是非虚的,有内存泄漏的风险,预防此事只需将他变成虚函数即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值