虚函数重写和私有,公共说明符

时间:2015-12-28 00:57:37

标签: c++ c++11 polymorphism

我很惊讶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。我认为虚函数可以在派生类中被覆盖,具有与基类相同的访问说明符,但这显然不是上述代码的工作方式,我观察到了错误吗?为什么访问说明符(publicprotectedprivate)不对如何覆盖虚函数施加限制?

1 个答案:

答案 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
}
     

- 结束示例]