当基类指针指向在基类中声明的派生类虚函数时,为什么会出现编译时错误?

问题描述 投票:1回答:2

我有一个基类,它有虚函数void function1(),并在派生类中被重写。另外,在我的派生类中还有一个虚函数,如下所示。

class Base
{
    public:
    virtual void function1()
    {
        cout<<"Base::Virtual function1"<<endl;
    }

};
class Derived1:public Base
{
    public:
    void function1()
    {
        cout<<"Derived1::Function1"<<endl;
    }
    virtual void function2()
    {
        cout<<"Derived1::function2"<<endl;

    }
};
int main()
{       
    Base *bptr = new Derived1();
    Derived1 *dptr = new Derived2();
    bptr->function2(); //compile time error

    return 0;
}

我想知道在编译时会发生什么,这会导致编译时错误。我想在面试的角度来回答一个问题。 Vtable和Vptr在这种情况下的表现如何?我知道将有一个基类的vptr,它将继承到Derived1类。编译器在编译时检查什么?

c++ polymorphism virtual-functions static-typing name-lookup
2个回答
3
投票

在基类qazxsw poi你没有虚拟qazxsw poi,所以如果你使用“Base”作为类型编译器找不到Base

改成:

function2

你可以使用function2。由于您没有Derived2,因此还有另一个错误


1
投票

编译器不跟踪bptr的运行时类型,而是始终将其视为指向Base的实例。您必须在Base中声明function2以便编译器确认它。另外,Derived中的function1不应该在基类中声明为虚拟吗?

© www.soinside.com 2019 - 2024. All rights reserved.