被重写的虚拟函数和私有、公共说明符
virtual function overridden and private, public specifier
我很惊讶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。我认为在派生类中只能用与基类中相同的访问说明符覆盖虚拟函数,但上面的代码显然不是这样工作的,我是否发现了问题?为什么访问说明符(public
、protected
和private
)不限制虚拟函数的重写方式?
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 }
-结束示例]
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 激励'inline'说明符的真实世界示例?
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 缺少类型说明符,显式类型为"缺少错误"
- 在 C++ 中用派生类型重写成员函数
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 叮叮当当在修复时插入多个"覆盖"说明符
- 为重写std::exception的库生成swig接口时出错
- 编译器错误:destuctor 的更宽松的抛出说明符
- 如何强制从重写方法调用重写的方法基方法?
- 用于C++的静态二进制检测或二进制重写工具和框架
- 如何将 if else 语句重写为 switch 语句
- 使用说明符 extern 声明的C++中的标识符链接
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 在回调中使用函数时,C++未知重写说明符
- VisualC++ 编译器错误 C3646:未知的重写说明符
- 使用字符串时,C++未知重写说明符
- 被重写的虚拟函数和私有、公共说明符