我是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时,它将包含重写函数,因此在调用它时,应调用子类重写函数(公共)。为什么会出现错误?
答案 0 :(得分:2)
在
Base * d = new Derived; d-> fun();
d 的静态类型是 Base ,在 Base 中, fun 是私有的,仅此而已>
如果您不想允许在 Base 上调用 fun ,并且由于其定义可能无济于事,您可以将其声明为公共和纯虚拟(virtual void fun() = 0;
) ,当然,您不能实例化Base,您只需要实例化Base的子代
答案 1 :(得分:0)
派生类无法访问类的私有成员。您需要将其公开或受保护。
鉴于虚拟功能的主要目的是为类的客户提供API,使它们成为私有的,从而破坏了语言的设计意图。