/* 条款36:绝不重新定义继承而来的non-virtual函数*/
#include<iostream>
using namespace std;
class B {
public:
void mf() {
cout << "B::mf()" << endl;
}
};
class D :public B {
public:
void mf() {
cout << "D::mf()" << endl;//遮掩了B::mf(名字隐藏)
}
};
int main() {
D x;
B*pB = &x;//non-virtual函数D::mf B::mf为静态绑定,通过pB调用,永远得到B::mf,如果是虚函数则为动态绑定 都会导致调用D::mf,因为 pB pD真正指的都是一个类型为D的对象
//就是说如果在子类中重新定义继承而来的非虚函数,会展现出精神分裂的不一致行径,决定因素在调用时的对象类型
//出现的矛盾1 是重新定义后的基类内容本应是子类的部分,但重新定义之后事实并非这样,public 继承的is-a的理论就不成立了
// 矛盾2 如果需要Public方式继承B ,且D需要表现出与B表现不同的特性,那mf就无法为B反映出“不变性凌驾特异性”的性质
//条款7又要求为多态基类的析构声明为虚,这与本例相左,但它是一个特例
pB->mf();//B::mf
D*pD = &x;
pD->mf();//D::mf
system("pause");
return 0;
}
条款36:绝不重新定义继承而来的non-virtual函数
最新推荐文章于 2023-06-16 12:40:11 发布