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的析构。

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

  • 相关阅读:
    HBase(九)HBase表以及Rowkey的设计
    iOS-动态库创建(详解)
    组件化-动态库实战
    Xcode创建子工程以及工程依赖
    XMPP详解
    iOS中WebKit框架应用与解析
    HYStockChart, 股票图(包括K线图、趋势图、成交量、滚动、放大缩小等)
    OC与JS交互
    iOS 与 js交互的其一方法 WebViewJavascriptBridge的使用
    OC和JS调用
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7387722.html
Copyright © 2011-2022 走看看