C++ 虚拟函数被重写且为私有、公共说明符

C++ 虚拟函数被重写且为私有、公共说明符,c++,c++11,polymorphism,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

我很惊讶
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;
}
C类{
公众:

virtual void f(){coutC++11标准没有提到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条)由其声明确定,不受后来覆盖它的函数规则的影响。[示例:

-[结束示例]


C++11标准没有提及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条)由其声明确定,不受后来覆盖它的函数规则的影响。[示例:

-[结束示例]


不,你观察的是正确的,你思考的是错误的。不,你观察的是正确的,你思考的是错误的。N4296说(10.3中的脚注):“在确定覆盖时不考虑访问控制(第11条)。”@AlexD,这一定是在C++11定稿后添加到C++14中的。很高兴知道他们明确了这一点。N4296说(10.3中的脚注):“在确定重写时不考虑访问控制(第11条)。@AlexD,这一定是在C++11定稿后添加到C++14中的。很高兴知道他们明确了这一点。