基类私有部分中的虚函数

时间:2019-01-12 13:47:40

标签: c++

我是C ++的新手,让我感到困扰的是,如果在基类的私有部分中定义了一个虚函数,而在子类中重写了相同的函数,则该子类在公共部分仍然在下面给出了编译器错误,是代码

#include<iostream> 
using namespace std; 

class Base 
{ 
    int x; 
    virtual void fun()
    {
    }
  public: 

    int getX() { return x; } 
}; 

// This class inherits from Base and implements fun() 
class Derived: public Base 
{ 
    int y; 
  public: 
    void fun() { cout << "fun() called"; } 
}; 

int main(void) 
{ 
    Base *d = new Derived; 
    d->fun(); 
    return 0; 
} 

创建vtable时,它将包含重写函数,因此在调用它时,应调用子类重写函数(公共)。为什么会出现错误?

2 个答案:

答案 0 :(得分:2)

  

Base * d = new Derived;      d-> fun();

d 的静态类型是 Base ,在 Base 中, fun 是私有的,仅此而已

如果您不想允许在 Base 上调用 fun ,并且由于其定义可能无济于事,您可以将其声明为公共和纯虚拟(virtual void fun() = 0;) ,当然,您不能实例化Base,您只需要实例化Base的子代

答案 1 :(得分:0)

派生类无法访问类的私有成员。您需要将其公开或受保护。

鉴于虚拟功能的主要目的是为类的客户提供API,使它们成为私有的,从而破坏了语言的设计意图。