同理,构造函数中依然也不应调用虚函数,原因在于:对象构造顺序是 先基类构造->派生类构造.在基类构造中调用虚函数时,虚表上尚未建立,派生类对象也未建立,此时自然无法通过调用派生类版本的函数来完成多态.
Effective C++条款9讲构造函数中不要调用虚函数已经很清楚了,析构函数与其类似 我猜你的疑惑在于不了解基类与派生类析构函数的执行顺序,C++中派生类在构造时会先调用基类的构造函数再调用派生类的构造函数,析构时则相反,先调用派生类的析构函数再调用基类的构造函数。 假设一个派生类的对象进行析构,首先调用了派生...
Note that calling a specific explicitly qualified function is not a virtual call even if the function is virtual. 注意:调用一个特定的限定函数不是虚调用,即使这个函数是虚函数。 See also factory functions for how to achieve the effect of a call to a derived class function without risking undefine...
由反汇编代码可知, CDerived 的构造函数会先调用 CBase 的构造函数进行基类部分的初始化,在 CBase 构造函数的内部把 CDerived 对象开始的位置设置为 CBase::vftable ,然后调用自身的初始化部分,会把 CDerived::vftable 的地址放到对象开始的位置,从而替换掉了 CBase类的虚表指针。 虚函数表的内容 了解完了虚表...
虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。 内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。 inline virtual 唯一可以内联的时候是:编译器知道所调用的对象是哪个类(如 Base::...
b)多态面试题强化(多态理解、重载重写重定义、为什么要有虚析构函数、构造函数中调用虚函数能实现多态...
问题98 构造函数不能是虚函数225 问题99 将基类析构函数声明为非虚函数225 问题100 在构造函数和析构函数里调用虚函数227 问题101 重载虚函数导致的问题229 问题102 在构造函数和析构函数中调用纯虚函数231 问题103 实例化抽象类232 问题104 派生类必须实现所有纯虚函数才是具体类,否则仍是抽象类234 练习21237 ...
面试题8 构造函数调用虚函数 229 面试题9 看代码写结果——虚函数的作用 230 面试题10 看代码写结果——虚函数 232 面试题11 虚函数相关的选择题 234 面试题12 为什么需要多重继承?它的优缺点是什么 235 面试题13 多重继承中的二义性 238 面试题14 多重继承二义性的消除 239 面试题15 多重继承和虚拟...
C++虚函数实例详解 首先引出,我们的新知识点——虚函数(virtual function)。 这是一种什么函数呢?简单来讲,就是一个函数前面用virtual声明的函数,一般形式如下: 1 2 3 4 virtual函数返回值 函数名(形参) { 函数体 } 那它有什么用呢?虚函数的出现,允许函数在调用时与函数体的联系在运行的时候才建立,即所谓...