精华内容
下载资源
问答
  • 虚析构

    2021-02-28 23:35:47
    1.要在基类中用虚析构 Q:为什么呢? A:因为当声明基类类型指向子类的对象时,如果父类声明普通析构,那么子类析构函数就不会被调用;只有父类声明虚析构的时候,通过虚函数表会调用到子类析构函数,这样才不会...

    原则:

    1.要在基类中用虚析构

    Q:为什么呢?

    A:因为当声明基类类型指向子类的对象时,如果父类声明普通析构,那么子类析构函数就不会被调用;只有父类声明虚析构的时候,通过虚函数表会调用到子类析构函数,这样才不会因为子类内存没被释放,出现内存泄漏的问题。

    展开全文
  • C++学习笔记之虚析构和纯虚析构/虚析构和纯虚析构的学习/虚析构和纯虚析构学习 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。 解决办法: 将父类中的析构函数改为虚析构...

    C++学习笔记之虚析构和纯虚析构/虚析构和纯虚析构的学习/虚析构和纯虚析构学习
    多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。
    解决办法: 将父类中的析构函数改为虚析构或者纯虚析构
    虚析构和纯虚析构共性:
    可以解决父类指针释放子类对象
    都需要有具体的函数实现
    虚析构和纯虚析构区别:
    如果是纯虚析构,该类是抽象类,无法实例化对象。
    虚析构语法

    virtual ~类名(){}
    

    纯虚析构语法

    virtual ~类名() = 0;
    类名::~类名(){}
    

    虚析构或纯虚析构就是用来解决父类指针释放子类对象
    如果子类中没有堆区数据,可以不写虚析构函数或纯虚析构
    拥有纯虚析构函数的类也属于抽象类

    #include <iostream>
    #include <string>
    using namespace std;
    
    //多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
    //解决方式:将父类中的析构函数改为 虚析构 或者 纯虚析构
    //虚析构 和 纯虚析构共性
    //可以解决父类指针释放子类对象
    //都需要有具体的函数实现
    
    //虚析构和纯虚析构区别:
    //如果是纯虚析构,该类属于抽象类,无法实例化对象
    
    class Animal   
    {
    public:
    	Animal()
    	{
    		cout << "Animal 构造函数调用 !" << endl;
    	}
    	virtual void speak() = 0;
    	//析构函数加上virtual关键字,变成虚析构函数
    	//virtual ~Animal()
    	//{
    	//	cout << "Animal虚析构函数调用!" << endl;
    	//}
    
    	/*~Animal()
    	{
    		cout << "Animal析构函数调用!" << endl;
    	}*/
    
    	virtual ~Animal() = 0;
    };
    Animal::~Animal()
    {
    	cout << "Animal 纯虚析构函数调用!" << endl;
    }
    //和包含普通纯虚函数的类一样,包含了纯虚析构函数的类也是一个抽象类。不能被实例化
    
    class Cat : public Animal
    {
    public:
    	Cat(string name)
    	{
    		cout << "Cat构造函数调用!" << endl;
    		m_Name = new string(name);
    	}
    	virtual void speak()
    	{
    		cout << *m_Name << "在说话" << endl;
    	}
    	~Cat()
    	{
    		cout << "Cat的析构函数!" << endl;
    		if (this->m_Name != NULL)
    		{
    			delete m_Name;
    			m_Name = NULL;
    		}
    	}
    public:
    	string* m_Name;
    };
    
    void test()
    {
    	Animal* animal = new Cat("小花");
    	animal->speak();
    	//通过父类指针去释放,会导致子类对象可能清理不干净,造成内存泄漏
    	//怎么解决? 给基类添加一个虚析构函数
    	//虚析构函数就额是用来解决通过父类指针是释放子类对象
    	delete animal;
    }
    int main()
    {
    	test();
    	return 0;
    }
    
    //总结:虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
    //如果子类中没有堆区数据,可以不写虚析构或纯虚虚构
    //拥有纯虚析构的类也属于抽象类
    

    C++学习笔记之虚析构和纯虚析构/虚析构和纯虚析构的学习/虚析构和纯虚析构学习

    展开全文
  • 参考链接 c++之虚析构和純虚析构

    参考链接
    https://www.cnblogs.com/xiximayou/p/12102379.html

    展开全文
  • 虚析构和纯虚析构

    2021-02-02 20:02:03
    虚析构和纯虚析构 多态使用时,如果子类有属性开辟到堆区,那么父类指针在释放时无法带调用到子类的析构代码 解决方式:将父类的析构函数改为纯虚析构或者虚析构 虚析构和纯虚析构的共性: 1.可以解决父类指针释放...

    虚析构和纯虚析构

    多态使用时,如果子类有属性开辟到堆区,那么父类指针在释放时无法带调用到子类的析构代码
    解决方式:将父类的析构函数改为纯虚析构或者虚析构

    虚析构和纯虚析构的共性:

    1.可以解决父类指针释放子类对象
    2.都必须要有具体的函数实现

    虚析构和纯虚析构的区别:
    如果是纯虚析构,该类属于抽象类,无法实例化对象

    #include<iostream>
    #include<string>
    using namespace std;
    class animal {
    public:
    	//构造函数
    	animal()
    	{
    		cout << "animal的构造函数调用" << endl;
    	}
        //纯虚函数
    	virtual void speak()
    	{
    		cout << "动物在说话" << endl;
    	}
    	//虚析构
    	virtual ~animal()
    	{
    		cout << "animal的析构函数调用" << endl;
    	}
    };
    class cat:public animal {
    public:
    	//构造函数
    	cat(string name) {
    		this->name = new string(name); //在堆区创建内存
    		cout << "cat的构造函数调用" << endl;
    	}
    	void speak()
    	{
    		cout <<*name<< "小猫在说话" << endl;
    	}
    	//写一个析构函数释放堆区内存
    	virtual ~cat() {
    		if (name != NULL)
    		{
    			cout << "cat的析构函数调用" << endl;
    			delete name; //释放堆区内存
    			name = NULL;
    		}
    	}
    	string* name;
    };
    void test()
    {
    	animal* a =new cat("tom");
    	a->speak();
    	delete a; //如果不在析构函数前加virtual,就只会调用父类析构函数
    }
    int main()
    {
    	test();
    	system("pause");
    	return 0;
    }
    

    纯虚析构写法:virtual ~animal()=0
    纯虚析构定义实现和虚析构一样:
    animal::~animal(){}

    展开全文
  • 文章目录虚析构和纯虚析构的共性:虚析构和纯虚析构的区别语法示例虚析构纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构...
  • C++虚析构与纯虚析构

    2021-03-15 22:10:14
    C++虚析构与纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码 解决方法: 将父类中的析构函数改为虚析构或纯虚析构 纯虚析构和虚析构共性: 1、可以解决父类指针释放...
  • 虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方法:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 1.可以解决父类指针释放...
  • C++虚析构和纯虚析构

    2020-11-08 12:34:56
    虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放...
  • c++虚析构和纯虚析构

    2020-12-26 10:51:26
    4.7.5 虚析构和纯虚析构 纯虚析构的使用场景:多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。(1.父类指针指向子类对象,2.子类在堆区有数据) 解决方式:将父类中的析...
  • 虚析构和纯虚析构原理 直接上代码:请根据编号查看代码说明。 先总结: 虚析构或纯虚析构就是用来解决通过父类指针释放子类对象 如果子类中没有堆区数据,可以不写为虚析构或纯虚析构 拥有纯虚析构函数的类也...
  • 虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 1)可以解决父类指针...
  • 虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放...
  • 虚析构和纯虚析构是为了解决以下问题: 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 虚析构和纯虚析构共性: 1、可以解决父类指针释放子类对象 2、都需要有具体的函数...
  • C++:虚析构和纯虚析构 一、虚析构 -若子类中存在指向堆区的属性,须利用虚析构技术(将父类析构函数写成虚函数),在delete时,才会调用子类的析构函数。 #include <iostream> #include <string> ...
  • 解决办法:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 1.可以解决父类指针释放子类对象 2.都需要有具体的函数实现 虚析构和纯虚析构的区别: 1.如果是纯虚析构,则该类属于抽象类,无法实例...
  • C++:虚析构和纯虚析构

    2021-04-03 16:26:15
    解决方式:将父类中的析构函数改为虚析构或纯虚析构加粗样式 虚析构和纯虚析构共性: 可以解决父类指针释放子类对象 都需要有具体的函数实现 区别: 如果是纯虚析构,该类属于抽象类,无法实例化对象 虚析构语法...
  • C++ 虚析构和纯虚析构

    2021-10-05 20:47:04
    //虚析构和纯虚析构 class Animal { public: Animal() { cout << "Animal的构造函数调用" << endl; } //利用虚析构可以解决父类指针释放子类对象时不干净的问题 //virtual ~Animal() //{ // ...
  • 虚析构与纯虚析构

    2019-10-08 18:35:20
    将父类中的析构函数改为虚析构或纯虚析构 实现语法:(二者只能有一个) 虚析构: (即析构函数代码前加 关键字 virtual) 声明: virtual ~类名() { 代码实现 }; 纯虚析构: (1)声明: virtual ~类名() = 0; (2)代码实...
  • 1、虚析构 基类指针指向的类型为父类在没有涉及虚析构的时候只能调用父类的析构函数,不能调用子类的析构函数 为了解决这个问题,就要用虚析构(虚函数) 虚析构作用:通过基类指针、引用释放子类的所有空间。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,576
精华内容 12,630
关键字:

虚析构