`
kuwoleft
  • 浏览: 1076771 次
文章分类
社区版块
存档分类
最新评论

9 绝对不要在构造函数和析构函数中调用virtual函数

 
阅读更多

derived class对象的base class对象构造期间,对象的类型是base class ,而不是derived class。所以virtual函数是base class中的函数,而不是derived class中的函数。

对象在derived class构造函数开始执行前,不会成为一个derived class函数。

同样的道理也适用于析构函数,一旦derived class对象开始执行,对象内的derived class成员变量便呈现未定义值。进入base class就是base class

确定你的构造函数和你的析构函数(在对象被创建和被销毁期间)都没有调用virtual函数,而且他们所调用的所有函数也必须满足这个要求。

解决这个问题,可以在derived class中返回信息给base class

注意:

在构造和析构期间不要调用virtual函数,因为这类调用从不降至derived class

分享到:
评论

相关推荐

    C++上机实验报告-实验五.docx

    编写程序定义一个基类BaseClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名:lab7_2.cpp。 3.用debug功能跟踪程序lab7_2的执行过程,观察...

    传智播客_C++基础课程讲义_v1.0.7

    3.6构造函数和析构函数的调用顺序研究 6 3.7构造函数和析构函数综合练习 6 3.8 对象的动态建立和释放 6 4静态成员变量成员函数 6 4.1静态成员变量 6 4.2静态成员函数 6 4.3综合训练 6 5 C++面向对象模型初探 6 5.1...

    深入理解c++中virtual关键字

    c++中的函数调用默认不适用动态绑定。要触发动态绑定,必须满足两个条件:第一,指定为虚函数;第二,通过基类类型的引用或指针调用。由此可见,virtual主要主要是实现动态绑定。 2.那些情况下可以使用virtual关键字...

    虚函数被类的构造析构函数和成员函数调用虚函数的执行过程

    代码如下:#include class base{public:  base() { std::cout<<std::endl;... virtual ~base() { std::cout<<std::endl; std::cout<<“base distructor”<<std::endl; func

    C# 构造函数如何调用虚方法

    在C#中,用virtual关键字修饰的方法(属性、事件)称为虚方法(属性、事件),表示该方法可以由派生类重写(override)。虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态成为可能。 然而虚方法的使用...

    从汇编角度看虚函数和普通成员函数的调用过程

    **normal成员函数:**其地址和一般函数的地址没有区别,就是函数代码在内存中的真实地址,但其调用要绑定到一个实实在在的对象上。取其地址需要使用“&”运算符。 **virtual成员函数:**其地址指的是其在vtable中的...

    C++ Primer第四版【中文高清扫描版】.pdf

    15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的类作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 500 15.6 纯虚函数 502 ...

    c.c++找工作面试重点结构图-mindmanager

    但仅仅用建立对象的最远派生类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类的构造函数的调用在执行中被忽略,从而保证对虚基类子对象只初始化一次。 (7) 在一个成员初始化列表中同时出现...

    深入理解C#中new、override、virtual关键字的区别

    a) 作为运算符用来创建一个对象和调用构造函数。 b) 作为修饰符。 c) 用于在泛型声明中约束可能用作类型参数的参数的类型。 在本文中,只具体介绍new作为修饰符的作用,在用作修饰符时,new关键字可以在派生类中隐藏...

    摩托罗拉C++面试题

    (4) 引用的创建和销毁并不会调用类的拷贝构造函数 (5) 语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换. 不存在空引用,并且引用一旦被初始化为指向一...

    C++虚析构函数的使用分析

    在C++中,不能声明虚构造函数,但可以声明虚析构函数。多态性是指不同的对象对同一消息有不同的行为特性。虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有...

    Java版水果管理系统源码-c-plus-Interview:c-plus-面试

    构造函数可以使用virtual修饰吗(头条) C++ 拷贝构造函数 如何禁用 什么时候要重载拷贝构造函数?(聊了以后发现他的意思是重写overriding) 构造函数的种类 构造函数的常用场景 构造函数和=运算符的区别 拷贝构造...

    深入探讨C++父类子类中虚函数的应用

    构造函数不能是虚函数,因为在调用构造函数创建对象时,构造函数必须是确定的,所以构造函数不能是虚函数。析构函数可以是虚函数。1.父类Father.h: 代码如下:#pragma onceclass Father{public: Father(void); ...

    C++大学教程,一本适合初学者的入门教材(part2)

    9.9 在派生类中使用构造函数和析构函数 9.10 将派生类对象隐式转换为基类对象 9.11 关于继承的软件工程 9.12 复合与继承的比较 9.13 对象的“使用”关系和“知道”关系 9.14 实例研究:类Point、CircIe和...

    C++大学教程,一本适合初学者的入门教材(part1)

    9.9 在派生类中使用构造函数和析构函数 9.10 将派生类对象隐式转换为基类对象 9.11 关于继承的软件工程 9.12 复合与继承的比较 9.13 对象的“使用”关系和“知道”关系 9.14 实例研究:类Point、CircIe和...

    新手学习C++入门资料

    这种情况多出现在用一个通用的函数指针调用多个函数的场合,其中有些函数不需要函数指针声明中的所有参数。看下面的例子: int fun(int x,int y) { return x*2; } 尽管这样的用法是正确的,但大多数C和C++的...

    EffectiveCPlusPlus

    不在构造析构过程中调用virtual函数 operator =返回对* this的引用 在operator =中处理自我赋值 复制对象时勿忘其每一个部份 以对象管理资源 在资源管理类中小心copping行为 在资源管理类中提供对原始资源的访问 成...

    c# program

    60. 除非在构造函数中调用其他构造函数否则不要使用this指针。 // 正确使用this的例子 public class MyClass { public MyClass(string message ) {} public MyClass() : this("hello") {} } ...

    面向对象与C++试题.doc

    下面函数调用中,不合法的是( )。 A.DefPar(5); B.DefPar(5,8); C.DefPar(5,'#'); D.DefPar(0,0,'*'); 4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( )...

Global site tag (gtag.js) - Google Analytics