zoukankan      html  css  js  c++  java
  • 条款七 为多态基类声明virtual析构函数

    1.如果基类中的成员函数是virtual类型的,其继承类中相应的函数也是virtual类型,并且基类对象的引用指向继承类对象时,
    基类就可以调用继承类函数,否则调用的是基类函数

    class base
    {
    public:
    virtual void fun(){ printf("base fun");}
    };
    
    class derived:public base
    {
    public:
    void fun(){ printf("derived fun");}
    };
    
    derived der;
    base &b = der; //或者base *b = &der;
    b.fun(); //或者b->fun(); 输出的结果是 derived fun;调用的是子类的函数
    //注意是在基类引用指向子类对象时才行; base b = der; 这个不行
    

    2.virtual析构函数有什么用? 如

    base * get()
    {
    derived * p = new derived;
    return p;
    }
    这样base类就可以调用子类函数,最后要释放new出来的内存
    base *ba = get();
    delete ba;
    因为base类的析构函数不是virtual类型的,所以delete ba这一边中只能调用基类的析构函数,无法调用子类的析构函数,
    这可能导致子类内存无法释放完毕
    所以在基类中的析构函数定义为virtual类型,这样delete ba时就可以调用子类的析构函数

    3.关于虚函数表的详细介绍,看链接 http://blog.csdn.net/haoel/article/details/1948051

    #include <iostream>
    using namespace std;
    
    class base
    {
       public:
     	void fun1(){ cout << "base fun1" << endl;}
    	virtual void fun2(){ cout << "base fun2" << endl;}
    	virtual ~base(){ cout << "base的析构函数 " << endl;} //注意virtual的析构函数的意义
    };
    
    class derived:public base
    {
       public:
    	void fun1(){ cout << "derived fun1" << endl;}
    	virtual void fun2(){ cout << "derived fun2" << endl;}
    	virtual ~derived(){ cout << "derived的析构函数" << endl;}
    };
    
    base* get()
    {
    	derived *der = new derived;
    	return der;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	derived d;
    	//base   * b = &d;
    	base  *b = get();
            b->fun1();
            b->fun2();
    	delete b;
    	return 0;
    }
    

     

     

  • 相关阅读:
    ie 中window.open无法带referrer
    es6 学习7 Set 和 Map 数据结构
    ES6 学习6 数组的扩展
    ES6 学习3 函数
    ES6学习之环境配置
    理解闭包
    javascript中实现继承的几种方式
    js 原型和原型链
    Vue学习之v-if与v-show的区别
    unity图集切成多张图片的方法
  • 原文地址:https://www.cnblogs.com/bizhu/p/2601695.html
Copyright © 2011-2022 走看看