/*避免继承而来的名称*/
//一朵玫瑰叫任何名字还是一样芬芳-----莎士比亚
//子类中查找一个成员的的名字的方法 1子类作用域 2 基类作用域
//3 内含基类的名字空间 4 全局
#include<iostream>
class Base {
public:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3() {
cout << "Base::mf3()" << endl;
}
void mf3(double) {
cout << "Base::mf3" << endl;
}
//..
};
class Derived :public Base {
public:
//改进后
using Base::mf1;//让基类中mf1 mf3在子类作用域内可见
using Base::mf3;
//-------------
//这里意味着如果你继承基类并加上重载函数,而你又希望重新定义或覆写其中的一部分,那么必须 为那些原本会被遮掩的每个名称引入声明式
virtual void mf1() {
cout << "Derived::mf1()" << endl;
}
void mf3() {
cout << "Derived::mf3()" << endl;
}
//从名称查找观点看,基类的mf1,mf3不再被子类继承
//即使基类与子类内的函数有不同的参数类型也适用,而且不论函数是虚还是非虚
//其背后的基本理由是防止你在程序中建立新的子类时附带从疏远的基类继承重载函数,而如果你使用公有继承而又不继承那些重载函数,就是违反is_a关系
void mf4() {
cout << "Derived::mf4()" << endl;
}
//..
};
//如果子类只想继承无参版本,如果是公有继承这种情况不会发生
class A {
public:
virtual void mf1() = 0;
virtual void mf1(int);
};
class B :private A {
public:
//using A::mf1;//会使继承来的名称所有同名函数在子类可见
virtual void mf1() {//转交函数
A::mf1();
}
};
using namespace std;
int main() {
Derived d;
int x;
d.mf1();// D::mf1
d.mf1(x);//子类遮掩了基类的函数//基类的mf1
d.mf2();//B::mf2
d.mf3();//D::mf3
d.mf3(x);//子类遮掩了基类的函数//基类的mf3
B a;
int x;
a.mf1();
a.mf1(x);
system("pause");
return 0;
}
条款 33 避免继承而来的名称
最新推荐文章于 2023-12-28 13:35:03 发布