条款 33 避免继承而来的名称

/*避免继承而来的名称*/
//一朵玫瑰叫任何名字还是一样芬芳-----莎士比亚
//子类中查找一个成员的的名字的方法 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值