zoukankan      html  css  js  c++  java
  • 关于虚析构函数的作用和使用

    作用:作为基类使用的类应该具有虚析构函数,以保证在删除基类指针(动态分配的对象)时。依据指针实际指向的对象进行适当的析构。

    请看以下这段代码;

    #include <iostream>
    
    class A{
    	public:
    	A(){
    		std::cout << "A constructor execute" << std::endl;
    	}
    	~A(){
    		std::cout << "A destructor execute" << std::endl;
    	}
    	virtual	void doSomething(){
    		std::cout << "A dosomething" << std::endl;
    	}
    };
    
    class B : public A
    {
    	public:
    		B(){
    			std::cout << "B constructor execute" << std::endl;
    		}
    		~B(){
    			std::cout << "B destructor execute" << std::endl;
    		}
    		void doSomething(){
    			std::cout << "B dosomething" << std::endl;
    		}
    };
    
    int main(int argc, char** argv) {
    	A *a = new B();
    	a->doSomething();
    	delete a;
    	return 0;
    }
    运行结果:

    能够看到:B的析构函数式没有被运行的,这在平时的编程中是很危急的。

    为了可以正确运行A和B的析构。我们将A的析构函数改为虚析构函数。

    #include <iostream>
    
    class A{
    	public:
    	A(){
    		std::cout << "A constructor execute" << std::endl;
    	}
    	virtual ~A(){
    		std::cout << "A destructor execute" << std::endl;
    	}
    	virtual	void doSomething(){
    		std::cout << "A dosomething" << std::endl;
    	}
    };
    
    class B : public A
    {
    	public:
    		B(){
    			std::cout << "B constructor execute" << std::endl;
    		}
    		~B(){
    			std::cout << "B destructor execute" << std::endl;
    		}
    		void doSomething(){
    			std::cout << "B dosomething" << std::endl;
    		}
    };
    
    int main(int argc, char** argv) {
    	A *a = new B();
    	a->doSomething();
    	delete a;
    	return 0;
    }
    运行结果:
    可见,此时能够先运行B的析构,再运行A的析构。

    并非全部的析构函数都须要写成虚函数,由于当类中含有虚函数的时候,编译器会给类加入一个虚函数表,里面用来放虚函数指针,这样会添加类的储存空间。

  • 相关阅读:
    AtCoDeer and Election Report
    乒乓球
    dp(装箱)
    《非你莫属》面试者现场跟面试官用英文对话,一口流利的英语口语厉害了
    冬天喝酸奶,可以加热吗?冬天喝酸奶,这4个方面要注意
    滑县两个富豪打赌,一人吃了一泡狗屎
    为什么外国富豪都喜欢捐光所有财产
    发的微博有敏感词
    社交网络
    怎么把word中的文字拉细变瘦长
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7387722.html
Copyright © 2011-2022 走看看