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中的。很高兴知道他们明确了这一点。