使用不在基 class 中的基 class 指针调用派生 class 函数时出现编译器错误

compiler error on calling derived class function using base class pointer which is not in base class

我正在学习 C++ 虚函数。

#include<iostream>

class Base{
    virtual void fun(){
        std::cout<<"Base\n";
    }
};

class Derived:public Base{
    void fun(){
        std::cout<<"Derived\n";
    }
    virtual void fun1(){
        std::cout<<"Derived 1 \n";
    }
};

int main(){
    Base* b=new Derived();
    b->fun1();
}

我写了这段代码,但它没有编译。按照动态多态的概念,如果我们创建一个base class 指向derived class 的指针,那么我们就可以调用derived class 的函数,对吗?使用class导出的虚指针,我们可以调用virtualtable中的fun1函数,对吧?

但是为什么这里没有编译呢?

您不能从 class 外部调用任何 BaseDerived 成员函数,因为这些函数是 private。你需要让他们 public

另一个问题: fun1 不是 Base 的成员,因此您不能通过基 class 指针调用 fun1

两种可能的解决方案:

  • Base 中声明纯 virtual void fun1() = 0Demo
  • 在调用 static_cast<Derived*>(b)->fun1(); 之前将 b 转换为 Derived*Demo

您的程序也在泄漏内存。你需要 delete b; 并且当你这样做时它现在只会调用 Base 析构函数(结果是 未定义的行为 )因为你的 Base 没有没有 virtual 析构函数。

virtual ~Base() = default;

然后在 main:

   // ...
   delete b;

Demo using the smart pointer std::unique_ptr<Base> 而不是手动 delete