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

标签 c++ polymorphism virtual-functions static-typing name-lookup

我有一个基类,它有 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 类。编译器在编译时检查什么?

最佳答案

在基类 Base 中,您没有虚拟 function2,因此如果您使用“Base”作为类型,编译器将无法找到 function2.

更改为:

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

    virtual void function2() = 0;

};

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

关于c++ - 当基类指针指向在基类中声明的派生类虚函数时,为什么会出现编译时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55183270/

相关文章:

c++ - 如何在 C++ 中异步处理 native 套接字上的 https 请求响应

c++ - 如何找出依赖于 LIB 文件的 DLL 列表?

c# - 检查多态对象的类型

c++ - 如果存在具有不同参数的继承成员,为什么对 C++ 结构的函数的调用会模棱两可?

c++ - 如何以良好的方式覆盖虚函数? [C++]

c++ - 集合类型的可变长度参数列表

c++ - 派生的、具体的、类的虚表

c++ - 何时在 C++ 中创建 vtable?

c++ - 如何防止基类指针下的派生类对象调用基类中定义但在派生中被覆盖的公共(public)非虚函数?

c++ - std::unordered_map 不可分配的内部对。如何?