在Visual C++中,包含虚函数的类对象的虚指针被安排在对象的起始地址处,并且虚函数表(vtable)的地址是由构造函数写入虚指针的。所以,一个类的构造函数在执行时,并不能保证该函数所能访问到的虚指针就是当前被构造对象最后所拥有的虚指针,因为后面派生类的构造函数会对当前被构造对象的虚指针进行重写,因此无法完成动...
从这里我们可以看出对于C#,多态是保证的,但是因为base class的构造函数在sub class的构造函数之前调用,这个时候sub class的成员变量只是被初始化成了defau值,因此如果虚函数中使用了依赖于sub class的构造函数的东西,就会出错。 C++则相当于直接把virtual去掉了。
构造函数 的 作用就是 创建对象 , 构造函数 最后 一行代码 执行完成 , 才意味着 对象构建完成 , 对象构建完成后 , 才会将 vptr 指针 指向 虚函数表 ; 如果在 构造函数 中 调用 虚函数 , 则 没有 多态效果 ; 一、vptr 指针初始化问题 1、vptr 指针与虚函数表 " 虚函数表 " 由 C++ 编译器 负责 创建...
这是一种特例,在这种情况下,即在构造子类时调用父类的构造函数,而父类的构造函数中又调用了虚成员函数,这个虚成员函数即使被子类重写,也不允许发生多态的行为。即,这时必须要调用父类的虚函数,而不子类重写后的虚函数。 我想这样做的原因是因为在调用父类的构造函数时,对象中属于子类部分的成员变量是肯定还没有...
谈谈关于构造函数中调用虚函数的情况,仅讨论单继承,不考虑虚拟继承和多重继承。 测试平台:VS2013 + Win7X64 一个例子: #include <stdlib.h> #include <stdio.h> class Base { private: int __data; public: Base() { this->Func(); } public: ...
C.82:不要在构造函数或析构函数中调用虚函数 Reason(原因) The function called will be that of the object constructed so far, rather than a possibly overriding function in a derived class. This can be most confusing. Worse, a direct or indirect call to an unimplemented pure virtual function fr...
首先,我们用一句在程序员中比较流行的话作为本文的开篇:如果你在基类的构造函数中调用虚函数,那么在基类构造期间,虚函数的行为像一个“实”函数。 在派生类对象的基类部分构造期间,对象的类型是base class,而不是derived class。这时,不只是虚函数会被编译器解析至基类型,就连RTTI中的typeid和dynamic_cast也会把对...
在构造函数中不能调用..#include<iostream>#include<cstdlib>struct A{public: virtual void foo(){ std::cout <
我们先来看下下面程序 运行上述程序后,得到以下输出: 可以看到在创建 YellowDog 对象时,首先会调用基类的构造函数,而且虽然是 YellowDog 调用的 seeDo...
关于虚函数,下列表述中错误的是( )。 A. 析构函数可以声明为虚函数 B. 构造函数可以声明为虚函数 C. 通过指针或引用对虚函数的调用称为多态调用 D. 虚函数在派生类重定义后仍然是虚函数,可以进一步重定义 相关知识点: 试题来源: 解析 B 反馈 收藏 ...