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

问题描述

我有一个基类,它具有 virtual 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 在这种情况下如何表现。我知道 Base 类将有一个 vptr,它将被继承到 Derived1 类。编译器在编译时检查什么?

标签: c++polymorphismvirtual-functionsstatic-typingname-lookup

解决方案


在基类中Base 你没有 virtual function2,所以如果你使用“Base”作为类型编译器找不到function2.

改成:

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

    virtual void function2() = 0;

};

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


推荐阅读