我很惊讶public
(或private
虚拟函数可以被private
(或public
)虚拟函数覆盖。见下文,
class C{
public:
virtual void f(){cout<<"C"<<endl;}
void g(){f();}
};
class D:public C{
private:
virtual void f(){cout<<"D"<<endl;}
};
int main(){
C * c = new D;
c->g();
return 0;
}
代码输出D
。我认为虚函数可以仅在派生类中被覆盖,具有与基类相同的访问说明符,但这显然不是上述代码的工作方式,我观察到了错误吗?为什么访问说明符(public
,protected
和private
)不对如何覆盖虚函数施加限制?
答案 0 :(得分:3)
C ++ 11 Standard没有提及 10.3虚函数中虚拟函数的访问说明符,至少我找不到。
鉴于此,D::f()
无法通过D
类型的对象或指针直接访问。
D* dPtr = new D;
dPtr->f(); // Does not work.
以下作品:
C* cPtr = new D;
cPtr->f();
因为C::f()
是C
的公共成员函数。
<强>更新强>
经过进一步调查,我发现了以下内容:
11.5访问虚拟功能
1虚函数的访问规则(第11节)由其声明确定,不受稍后覆盖它的函数规则的影响。 [例如:
class B { public: virtual int f(); }; class D : public B { private: int f(); }; void f() { D d; B* pb = &d; D* pd = &d; pb->f(); // OK: B::f() is public, // D::f() is invoked pd->f(); // error: D::f() is private }
- 结束示例]