被重写的虚拟函数和私有、公共说明符

virtual function overridden and private, public specifier

本文关键字:说明符 重写 虚拟 函数      更新时间:2023-10-16

我很惊讶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;
}

代码输出CCD_ 5。我认为在派生类中只能用与基类中相同的访问说明符覆盖虚拟函数,但上面的代码显然不是这样工作的,我是否发现了问题?为什么访问说明符(publicprotectedprivate)不限制虚拟函数的重写方式?

C++11标准没有提到10.3虚拟函数中虚拟函数的访问说明符,至少我找不到。

假定D::f()不能通过类型为D的对象或指针直接访问。

D* dPtr = new D;
dPtr->f();      // Does not work.

以下工作:

C* cPtr = new D;
cPtr->f();

因为CCD_ 11是CCD_。

更新

经过进一步调查,我发现以下情况:

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
}

-结束示例]