同理,构造函数中依然也不应调用虚函数,原因在于:对象构造顺序是 先基类构造->派生类构造.在基类构造中调用虚函数时,虚表上尚未建立,派生类对象也未建立,此时自然无法通过调用派生类版本的函数来完成多态.
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类的虚表指针。 虚函数表的内容 了解完了虚表...
因为foo()是个虚函数,所以在bar这个函数中,只根据这段代码,无从确定这里被调用的是Father::foo()还是Sun::foo(), 但是可以肯定的说:如果a指向的是Father类的实例,则Father::foo()被调用,如果a指向的是Sun类的实例,则Sun::foo()被 调用。 这种同一代码可以产生不同效果的特点,被称为“多态”。
b)多态面试题强化(多态理解、重载重写重定义、为什么要有虚析构函数、构造函数中调用虚函数能实现多态...
虚函数指针:在对象的内存布局中,编译器会添加一个额外的指针,称为虚函数指针或虚表指针。这个指针指向该对象对应的虚函数表,从而让程序能够动态的调用虚函数。 当一个基类指针或引用调用虚函数时,编译器会使用虚表指针来查找该对象对应的虚函数表,并根据函数在虚函数表中的位置来调用正确的虚函数。 在编译阶段生成...
A.析构函数中调用虚函数采用静态联编B.对虚析构函数的调用可以采用动态联编C.当基类的析构函数是虚函数时,其派生类的析构函数也一定是虚函数D.构造函数可以声明为虚函数 2下列关于构造函数和析构函数的描述,错误的是( )。 A.析构函数中调用虚函数采用静态联编B.对虚析构函数的调用可以采用动态联编C.当基类...