精华内容
下载资源
问答
  • 构造函数可以为虚函数吗?

    千次阅读 2017-09-25 08:47:44
    那么问题来了,如果构造函数虚函数,就要通过vtable来调用,可是对象空间还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。 从使用角度 虚函数主要用于在信息不全的情况下,能够...

    答案当然是否定的,主要从一下两个角度加以说明。

    1. 从存储空间角度
      虚函数对应一个vtable,可是这个vtable其实是存储在对象的内存空间的。
      那么问题来了,如果构造函数是虚函数,就要通过vtable来调用,可是对象空间还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。

    2. 从使用角度
      虚函数主要用于在信息不全的情况下,能够使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义。
      另外,虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数,从而实现多态,也就是实现“一个接口,多种方法”。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此规定构造函数不能是虚函数。

    展开全文
  • 构造函数和析构函数是否可以是虚...首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。 举例说明: 子类B继承自基类A;A *p = new B

    构造函数和析构函数是否可以是虚函数,为什么?

    1. 为什么构造函数不能为虚函数?

    虚函数的调用需要虚函数表指针,而该指针存放在对象的内容空间中;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数——构造函数了。

    2. 为什么析构函数可以为虚函数,如果不设为虚函数可能会存在什么问题?

    首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。

    举例说明:

    子类B继承自基类A;A *p = new B; delete p;

    1) 此时,如果类A的析构函数不是虚函数,那么delete p;将会仅仅调用A的析构函数,只释放了B对象中的A部分,而派生出的新的部分未释放掉。

    2) 如果类A的析构函数是虚函数,delete p; 将会先调用B的析构函数,再调用A的析构函数,释放B对象的所有空间。

    补充: B *p = new B; delete p;时也是先调用B的析构函数,再调用A的析构函数。

    #include <iostream>
    using namespace std;
    
    class A
    {};
    
    class B:public A
    {};
    
    class Base
    {
    public:
    	Base(void)
    	{
    		cout << "我是Base类的构造函数" << endl;
    	}
    
     	~Base(void)
    	{
    		cout << "我是Base类的析构函数" << endl;
    	}
    	virtual A* func(void)
    	{
    		cout << "我是Base类的虚函数" << endl;
    	}
    };
    
    class Test:public Base
    {
    public:
    	Test(void)
    	{
    		cout << "我是Test类的构造函数" << endl;
    	}
    	
    	~Test(void)
    	{
    		cout << "我是Test类的析构函数" << endl;
    	}
    	//它可以覆盖负累中的虚函数
    	B* func(void)
    	{
    		cout << "我是Test类的函数func" << endl;
    	}
    };
    
    void test(Base* b)
    {
    	b->func();
    }
    
    int main(int argc,const char* argv[])
    {
    	Base* t = new Test;
    	cout << "----------" << endl;
    	test(t);
    	cout << "----------" << endl;
    	delete t;
    	//test(new Base);
    }
    

    上面可以说是多态的一种运用,用父类指针来指向子类对象,然后调用被覆盖函数。

    输出:

    当父类中的析构函数~Base(void)没有加virtual关键字时,在释放内存时只会调用父类的虚函数释放父类占用的内存,而子类Test的虚函数并没有被调用,这就会导致内存泄露,没有及时得到释放。

    我是Base类的构造函数
    我是Test类的构造函数


    我是Test类的函数func


    我是Base类的析构函数

    此时的结果为父类中的析构函数~Base(void)加virtual关键字后,也调用了子类的虚函数。

    我是Base类的构造函数
    我是Test类的构造函数


    我是Test类的函数func


    我是Test类的析构函数
    我是Base类的析构函数

    展开全文
  • (1)为什么构造函数的名字用类名?是如何可虑的? (2)构造函数返回值问题... (3)析构函数和构造函数定义为虚函数;析构函数可以定义为虚你函数,而且建议定义为虚拟函数。在子类型化后,虚拟的析构函数可以被动

    (1)为什么构造函数的名字用类名?是如何可虑的?

     

    (2)构造函数返回值问题;

    构造函数有隐含的返回值,供系统使用,具体如何说明??

    构造函数是用来初始为对象的内存空间,因此本内存本身是一个返回值;

    构造函数不能被用户直接调用,只能被系统调用。

     

    (3)析构函数和构造函数定义为虚函数;

    析构函数可以定义为虚你函数,而且建议定义为虚拟函数。

    在子类型化后,虚拟的析构函数可以被动态正确地调用,因而可以保证不会出现内存泄漏。

     

    构造函数不能被定义为虚函数。

    构造函数是用来初始化一个对象的,包括一些运行时信息和动态调用函数的信息。

    如果构造函数被定义为虚函数,那么在初始化对象时,由于没有调用那个虚构造函数的信息(因为没有初始化完),因此可能出现调用失败。

    展开全文
  • 1、构造函数不允许为虚函数,因为虚函数会有指向虚函数列表的指针;对象生成的过程为:先申请内存,然后调用构造函数生成对象。 2、析构函数可以为虚函数,且存在子类的类最好是定义为虚函数,否则会造成删除指向子...

    1、构造函数不允许为虚函数,因为虚函数会有指向虚函数列表的指针;对象生成的过程为:先申请内存,然后调用构造函数生成对象。

    2、析构函数可以为虚函数,且存在子类的类最好是定义为虚函数,否则会造成删除指向子对象的父指针时不能调用子对象的析构函数。

    3、析构函数可以为纯虚函数,但必须把它实现,否则会编译不能通过,因为子对象仍是要调用父类的析构函数。

    4、一个不包含任何成员变量只有非虚成员函数的类,其大小为1字节。如果存在虚函数,则其大小为4字节,不管有多少虚函数,均为4字节。

    5、必须使用类参数初始化列表的情形:A,类中包含带参数的构造函数的对象;B,类中包含const变量;C,类中包含引用类型。

    转载于:https://www.cnblogs.com/fixer/p/3139453.html

    展开全文
  • 有关析构函数和构造函数的几点说明: ...构造函数可以重载,析构函数不可以重载(构造函数可以有参数,析构函数没有参数。) 构造函数不可以是虚函数,析构函数可以是虚函数 (1. 构造函数为什么不能为虚函数? a...
  • 构造函数

    千次阅读 2017-03-06 14:27:11
    构造函数对类成员变量进行了赋值的时候,成员函数才可以设置无参。如果构造函数是无参的,可以用成员函数来进行初始化 基类的初始化与一般继承的初始化在语法上是一样的,但构造函数的调用次序不同。派生...
  • 哪些函数不能设置为虚函数

    千次阅读 2018-08-06 22:27:46
    1:只有类的成员函数才能说明为虚函数; 2:静态成员函数不能是虚函数; 3:内联函数不能为虚函数; 4:构造函数不能是虚函数; 5:析构函数可以是虚函数,而且通常声明为虚函数。 虚函数可以实现多态,那么那些...
  • 那些函数不可以定义为虚函数呢?现在就让我们了解一下。 1.普通函数。 2.友元函数。 以上两个都不是类的成员函数 4.静态成员函数;虚函数一定要通过对象来调,而静态成员函数不用(说明静态成员函数不在虚表之中...
  • 设置虚函数须注意:1:只有类的成员函数才能说明为虚函数;2:静态成员函数不能是虚函数;3:内联函数不能为虚函数;4:构造函数不能是虚函数;5:析构函数可以是虚函数,而且通常声明为虚函数。 类里面“定义”...
  • 1,只有类的成员函数才能说明为虚函数;普通函数(不能被覆盖) 2,静态成员函数不能是虚函数;(只有一份大家共享)  3,内联函数不能为虚函数;(编译期间展开,虚函数是在运行期间绑定) 4,构造函数不能是虚...
  • 虚函数

    2019-03-20 12:21:00
    一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的,但以下不可以设置为虚函数:①只有类的成员函数才能说明为虚函数;②静态成员函数不能是虚函数(虚函数是动态绑定的,静态函数必然不可);③内联函数不...
  • 虚函数:虚函数相当于函数指针,占用四个字节(对于32位),在类中虚函数占用四个...不能将友元函数说明为虚函数,但是虚函数可以是另一个类的友元。 3.析构函数可以是虚函数,但是构造函数不能是虚函数。#inclu...
  • 1:只有类的成员函数才能说明为虚函数;  2:静态成员函数不能是虚函数;  3:内联函数不能为虚函数;  4:构造函数不能是虚函数;  5:析构函数可以是虚函数,而且通常声明为虚函数。 原因:内联...
  • 构造函数说明以下几点: 1.构造函数的函数名必须与类名相同。构造函数的主要作用是完成初始化对象的数据成员以及其它的初始化工作。 2.在定义构造函数时,不能指定函数返回值的类型,也不能指定void类型。 3....
  • C/C++编程:构造函数

    2021-03-17 21:56:50
    经过构造函数完全初始化后的对象可以为const类型,也能更方便的被标准容器或算法使用 缺点 定义 构造函数是类的一种特殊的非静态成员函数,用于初始化该类类型的对象 非静态成员函数:非静态成员函数是声明于类的...
  • 虚函数:函数中带有关键字virtual 纯虚函数:纯虚函数是在基类中申明为虚函数,它在基类中...不能将友员函数说明为虚函数,但是虚函数可以是另一个类的友员。 虚构函数可以是虚函数,但是构造函数不能为虚函数。一般.
  • 接口与虚函数的区别

    2019-07-14 19:46:15
    接口只能声明,不能实现,虚函数可以。...1.虚函数仅适用于有继承关系的类对象, 所以只有类的成员函数才能说明为虚函数. 2.静态成员函数不能是虚函数. 3.内联函数不能是虚函数. 4构造函数不能是虚...
  • 上节我们讲到,构造函数不能是虚函数,因为派生类不能继承基类的构造函数,将构造函数声明为虚函数没有意义。 这是原因之一,另外还有一个原因:C++ 中的构造函数用于在创建对象时进行初始化工作,在执行构造函数...
  • C++析构函数

    2016-09-23 21:07:00
    在类中,构造函数用于初始化对象及相关操作,构造函数是不能声明为虚函数的,因为在执行构造函数前对象尚未完成创建,虚函数表尚不存在,此时就无法去查询虚函数表,因此也就无法得知该调用哪一个构造函数了。...
  • 多态性是指一个名字,多种语义;或界面相同,多种实现。函数重载就是多态性的一种简单形式...不能将友元说明为虚函数,但虚函数可以是另一个类的友元。析构函数可以是虚函数,但构造函数不能是虚函数。 实现运行时...
  • C++学习24 析构函数

    2019-09-30 13:15:56
    在C++中,构造函数用于在创建对象时进行初始化工作,不能声明为虚...析构函数则用于在销毁对象时完成相应的资源释放工作,可以被声明为虚函数。 为了说明虚析构函数的必要性,请大家先看下面一个例子: #include...
  • 在类中,构造函数用于初始化对象及相关操作,构造函数是不能声明为虚函数的,因为在执行构造函数前对象尚未完成创建,虚函数表尚不存在,此时就无法去查询虚函数表,因此也就无法得知该调用哪一个构造函数了。...
  • 程序基石系列(十四) 析构函数

    千次阅读 2014-11-06 12:19:22
    通过定义基类的析构函数~A()为虚成员函数,可以确保其派生类的析构函数为虚成员函数.为了使代码更清晰,我们可以明确地使用关键字virtual来声明~Z(),不过即使我们不这样做,~Z()仍然为虚成员函数,由于析构函数已经...
  • 初识虚函数 用virtual关键字说明的函数 虚函数是实现运行时多态性基础 C++中的虚函数是动态绑定的函数 虚函数必须是非静态的成员函数,虚函数...虚函数一般不声明内联函数,因为对虚函数的调用需要动态绑定,而对内联
  • 不能将虚函数说明为全局(非成员)的函数,也不能说明为静态成员函数.3、不能把友员函数(友员类)说明为虚函数,但虚函数可以是另一个类的友员(友员类).4、析构函数可以是虚函数,但是构造函数不能是虚函数.当在构造函数和...
  • 要列述的有:虚函数,纯虚函数,纯析构函数,构造函数可否为虚函数,析构函数和构造函数内部为什么不可以含有虚函数。 1.首先虚函数的意思就不说了,主要是多态中的中流砥柱角色; 2.纯虚函数:(非析构函数)纯虚...

空空如也

空空如也

1 2 3 4 5 6
收藏数 114
精华内容 45
关键字:

构造函数可以说明为虚函数