精华内容
下载资源
问答
  • 不建议在构造函数和析构函数里面调用虚函数。 构造函数不能声明为虚函数的原因是: 解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。...

    构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。

    不建议在构造函数和析构函数里面调用虚函数。

    构造函数不能声明为虚函数的原因是:

    解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造。还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错。

    解释二:虚函数的主要意义在于被派生类继承从而产生多态。派生类的构造函数中,编译器会加入构造基类的代码,如果基类的构造函数用到参数,则派生类在其构造函数的初始化列表中必须为基类给出参数,就是这个原因。

    虚函数的意思就是开启动态绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时候,这个对象的动态类型还不完整,没有办法确定它到底是什么类型,故构造函数不能动态绑定。(动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?)

    编译器在调用基类的构造函数的时候并不知道你要构造的是一个基类的对象还是一个派生类的对象。

    析构函数设为虚函数的作用:    

    解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。

    例:

    #include   "stdafx.h"  

    #include   "stdio.h"  

    class   A      

    {  

    public:  

    A();  

    virtual   ~A();  

    };  

    A::A()  

    {  

    }  

       

    A::~A()  

    {  

    printf("Delete   class   AP/n");  

    }  

    class   B   :   public   A      

    {  

    public:  

    B();  

    ~B();  

    };  

       

    B::B()  

    {   }  

       

    B::~B()  

    {  

    printf("Delete   class   BP/n");  

    }  

    int   main(int   argc,   char*   argv[])  

    {  

    A   *b=new   B;  

    delete   b;  

    return   0;  

    }      

       

    输出结果为:Delete   class   B        

                            Delete   class   A  

       

    如果把A的virtual去掉:那就变成了Delete   class   A

    因此在类的继承体系中,基类的析构函数不声明为虚函数容易造成内存泄漏。所以如果你设计一定类可能是基类的话,必须要声明其为虚函数。正如Symbian中的CBase一样。Note:

    1. 如果我们定义了一个构造函数,编译器就不会再为我们生成默认构造函数了。

    2. 编译器生成的析构函数是非虚的,除非是一个子类,其父类有个虚析构,此时的函数虚特性来自父类。

    3. 有虚函数的类,几乎可以确定要有个虚析构函数。

    4. 如果一个类不可能是基类就不要申明析构函数为虚函数,虚函数是要耗费空间的。

    5. 析构函数的异常退出会导致析构不完全,从而有内存泄露的问题。最好是提供一个管理类,在管理类中提供一个方法来析构,调用者再根据这个方法的结果决定下一步的操作。

    6. 在构造函数不要调用虚函数。在基类构造的时候,虚函数是非虚,不会走到派生类中,既是采用的静态绑定。显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。但是不是说你不可以那么写程序,你这么写,编译器也不会报错。只是你如果这么写的话编译器不会给你调用子类的实现,而是还是调用基类的实现。

    7. 在析构函数中也不要调用虚函数。在析构的时候会首先调用子类的析构函数,析构掉对象中的子类部分,然后在调用基类的析构函数析构基类部分,如果在基类的析构函数里面调用虚函数,会导致其调用已经析构了的子类对象里面的函数,这是非常危险的。

    8. 记得在写派生类的拷贝函数时,调用基类的拷贝函数拷贝基类的部分,不能忘记了。

    展开全文
  • 构造函数和析构函数调用虚函数时都不使用动态联编,如果在构造函数或者析构函数中调用虚函数,则运行的是为构造函数或者析构函数自身定义类型的版本; 父类对象会在子类之前进行构造函数,此时子类函数部分的数据...

    可以是,但是不提倡。

    1. 在C++中,提倡不在构造函数和析构函数中调用虚函数;
    2. 构造函数和析构函数调用虚函数时都不使用动态联编,如果在构造函数或者析构函数中调用虚函数,则运行的是为构造函数或者析构函数自身定义类型的版本;
    3. 父类对象会在子类之前进行构造函数,此时子类函数部分的数据成员还未初始化,因此调用子类的虚函数是不安全的,因此C++不会进行动态联编;
    4. 析构函数是用来销毁一个对象的,在销毁对象时先调用子类的析构函数,然后再调用基类的析构函数。所以在调用基类的析构函数时,派生类对象的数据成员已经销毁,这个时候再调用子类的虚函数没有意义。
    5. 即使成功的调用了虚函数,程序的运行结果也是不可控的。
    展开全文
  • 构造函数和析构函数中调用虚函数时,采用静态联编(他们所调用的虚函数是自己类中定义的函数) 如果在自己类中没有实现这个虚函数,则调用的是基类中的虚函数,绝不会是任何在派生类中重定义的虚函数 //构造函数和...

    在构造函数和析构函数中调用虚函数时,采用静态联编(他们所调用的虚函数是自己类中定义的函数)
    如果在自己类中没有实现这个虚函数,则调用的是基类中的虚函数,绝不会是任何在派生类中重定义的虚函数

    //构造函数和析构函数中调用虚函数
    #include <iostream>
    using namespace std;
    class Base
    {
    	public:
    		Base(){func1();}
    		virtual void  func1()                    //虚函数
    		{
    			cout <<"This is Base func1() "<<endl;
    		}
    		virtual void func2()
    		{
                cout <<"This is Base func2() "<<endl;
    		}
            ~Base(){func2();}
    };
    class Subclass :public Base
    {
    	public:
    		virtual void func1()                        //虚函数
    		{
    			cout <<"This is Subclass func1() "<<endl;
    		} 
    		virtual void func2()                        //虚函数
    		{
    			cout <<"This is Subclass func2() "<<endl;
    		}   
    };	
    
    int main ( )
    {
       Subclass  sc;       
       cout<<"Exit main"<<endl;
       return 0;   
     } 
    

    结果

    This is Base func1()
    Exit main
    This is Base func2()
    
    展开全文
  • C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数。 (1) 构造函数不能为虚函数 编译器会为每个含有虚函数的类创建一个虚函数表,在创建对象时会创建一...

    C++:构造函数和析构函数能否为虚函数?

    简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数。

    (1) 构造函数不能为虚函数

           编译器会为每个含有虚函数的类创建一个虚函数表,在创建对象时会创建一个虚函数表指针指向虚函数表。如果构造函数是虚函数,则需要用对象来调用构造函数,构造函数之前对象还不存在,因此构造函数不能为虚函数。

    (2)析构函数可以是虚函数

          当基类对象的指针指向派生类对象,若析构函数不为虚函数,delete基类对象的时候,只会调用基类的析构函数,不会调用派生类的析构函数,这样会造成内存泄漏。(若果析构函数是虚函数,则会先调用派生类的析构函数然后在调用基类的析构函数。)

    转载于:https://www.cnblogs.com/dingou/p/10281154.html

    展开全文
  • 构造函数不能是虚函数,因为虚函数是基于对象的,构造函数是用来产生对象的,若构造函数虚函数,则需要对象来调用,但是此时构造函数没有执行,就没有对象存在,产生矛盾,所以构造函数不能是虚函数。 析构函数是...
  • 在有虚函数成员的情况下,构造函数和析构函数都会有不透明的对虚函数指针的写操作。  因此,在构造函数和析构函数中调用虚函数是危险的行为。 转载于:https://www.cnblogs.com/invisible/p/3317741.html...
  • 在此过程中我们引发了一个讨论,基类中的构造函数和析构函数是否也可以定义为虚函数呢?下面我们一起来分析一下。 构造函数 首先我们来看一下构造函数的定义: 类的构造函数是类的一种特殊的成员函数,它会在每...
  • //program15.4.2.cpp构造函数和析构函数中调用虚函数 using namespace std; class A { public: virtual void hello() { cout << " A::hel1o" << endl; }; virtual void bye() { cout << "A::bye...
  • 1.构造函数必不可以是虚函数 2.析构函数可以是虚函数,...4.析构函数不仅可以是虚函数,有时还必须是虚函数,因为基类相对于子类,基类的析构函数若不是虚函数,子类析构函数就会即调用自己的析构又调用基类的。 ...
  • 提到构造函数和析构函数,想必大家肯定是非常了解,但是能否在构造函数或是析构函数中调用虚函数呢? 答案是千万不要这么做,这么做不会得到大家想要的结果。 首先提一下构造函数,构造函数的顺序是从基类开始构造...
  • 虚函数存储在虚函数表中,这个虚函数表是由对象的 __vfptr 成员变量指向的,如果构造函数虚函数就需要通过虚函数表来调用,可是对象还没有实例化,还没有构造 __vfptr 成员变量,也就找不到虚函数表,无法找到并...
  • 三、构造函数和析构函数可以是虚函数吗?为什么? 1、构造函数 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,...
  • 一、构造函数和析构函数中对虚函数的调用 仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例 base3构造函数和析构函数的部分汇编代码如下 可见直接在构造函数或者析构函数中...
  • 探究在构造函数和析构函数中调用虚函数究竟会导致什么样的结果,探究应有的预期,与可能的正确写法
  • 可以,虚函数底层实现原理(但是最好不要在构造和析构函数中调用) 可以,但是没有动态绑定的效果,父类构造函数中调用的仍然是父类版本的函数,子类中调用的仍然是子类版本的函数。 effictive c++第九条,绝不在构造...
  • 构造函数和析构函数中的虚函数 */ #include using namespace std; class Base { public: //在构造函数和析构函数中调用虚函数,则运行自身类型定义的版本。原因是初始化顺序:先基类后派生 Base() { Print(); ...
  • 构造函数和析构函数是否可以是虚函数,为什么? 1. 为什么构造函数不能为虚函数虚函数的调用需要虚函数表指针,而该指针存放在对象的内容空间中;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间...
  • 不建议在构造函数和析构函数里面调用虚函数。 构造函数不能声明为虚函数的原因是: 解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。如果构造...
  • 构造函数和析构函数常见面试题?构造函数和析构函数常见面试题?1、永远不要在构造函数或析构函数中调用虚函数2、为什么构造函数不能定义为虚函数3、为什么析构函数可以定义为虚函数4、构造函数的执行顺序?析构函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,082
精华内容 432
关键字:

构造函数和析构函数虚函数