c++ - 从派生构造函数调用基类的虚函数

标签 c++ function constructor virtual

我知道从构造函数/析构函数调用虚函数解析为早期绑定(bind)。但我在这里有一个问题。看下面的代码

class Base
{
    public:
    virtual void fun()
    {
        cout<<"In Base"<<endl;
    }
};

class Derived : public Base
{
    public:
    Derived(Base obj)
    {
        Base *p;
        p = &obj;
        p->fun();
    }
    void fun()
    {
        cout<<"In Derived"<<endl;
    }
};

int main()
{
    Base b;
    Derived d(b);
}

O/P 是:在基地

我的疑问是,编译器可能使用动态绑定(bind)而不是早期绑定(bind)。请纠正我,我错了,但我需要清楚地解释编译器如何在构造函数中执行早期绑定(bind)?

如果该方法不是构造函数,编译器会将此语句 p->fun in 转换为类似于

fetch the VPTR at run time (This vptr will have the derived class VTABLE address)

invoke method at vptr + offset 

hence the right virtual function is invoked.

但是因为它是一个构造函数,编译器是否停止考虑虚拟机制并简单地忘记指针类型并将上面的语句 p->fun() 替换为 obj.fun() (在内部将其视为调用适当的对象)

因为即使您进行早期绑定(bind)或后期绑定(bind),结果都是相同的(调用本地 fun() )

此外,如果它是根据构造函数内部的早期绑定(bind)机制调用的函数的本地版本,那么我们如何调用不是派生本地函数的基版本(我知道派生包含基子对象,但如果构造函数在虚函数的构造函数中执行早期绑定(bind),则需要知道调用基本版本而不是本地/派生函数的原因)

请帮忙

最佳答案

因为您正在将一个实际的 Base 传递给创建者(不是指针或引用),所以您所拥有的是一个实际的 Base 实例 - 将指针转换为Derived* 无效。

关于c++ - 从派生构造函数调用基类的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53334537/

相关文章:

perl - 如何在 Perl 中使用数组作为对象属性?

javascript - "(function ( ) { } ) ( )"和 "(function ( ) { } ( ) )"在 JavaScript 中功能相同吗?

c++ - 如何抛出好的异常?

c++ - 在 C++ 中作为参数传递的类型名

c++ - (c++) 如何有效地制作升序(dyn.solution)

c++ - 如何将数据类型传递给参数而不是变量

python - python中输出-1或0或1的函数

c++ - 成员初始化列表中的 unique_ptr

c++ - 继承带有默认参数的构造函数?

c++ - 异常规范作为函数声明中的注释