为什么在构造期间在基类中调用被重写的虚函数

Why does an overridden virtual function get called in the base class during construction?

本文关键字:重写 函数 调用 基类 为什么      更新时间:2023-10-16

有一个c++程序:

# include <iostream>
using namespace std;
class base
{
public:
    base()
    {
        cout<<"base"<<endl;
        f();
    }
    virtual void f() {
        cout<<"base f"<<endl;
    }
};
class derive: public base
{
    public:
        derive()
        {
            cout<<"derive"<<endl;
            f();
        }
    void f() {
        cout<<"derive f"<<endl;
    }
};
int main()
{
    derive d;
    return 1;
}

,输出:

base
base f
derive
derive f

我想知道为什么基底f出现?

我猜在base中构造函数展开为:

        cout<<"base"<<endl;
        this.f();

但是这应该指向推导,那么为什么输出底f呢?

在构造过程中,在基类构造函数中,对象的实际类型是base,尽管它随后继续成为derived。在销毁过程中也会发生同样的情况,顺便说一句,您也可以使用typeid来验证类型。