函数重载 隐藏 覆盖

重载

这个没什么问题,都懂,唯一需要记住的是 只有形参类型or个数不一样,才能重载,不关返回类型的事情

隐藏

这个跟名字查找有关系,c++是先在自己静态类型的作用域查找名字,找到就不找了(然后执行类型检查),找不到再往外层作用域一步步查找,所以简单说就是:

内层作用域的一个叫 fcn的函数,隐藏掉了外层作用域的 fcn函数  (不管形参类型,返回类型这些乱七八糟的是不是一样)

覆盖

覆盖专指虚函数的覆盖(这里它跟基类的虚函数  必须返回类型啊,形参类型啊都完全有一个,有一个特例 见c++prime 537),覆盖的同时 肯定也起到了隐藏的作用,所以说覆盖是隐藏的特例。

class Base {
public:
	virtual void fcn() {
		cout << 1 << endl;
	}

	void fcn(int i) {
		cout << 2 << endl;
	}
//private:                     (1)
//	void fcn(string s) {
//		cout << "hh" << endl;
//	}
};

};

class Derived :public Base {
public:
	//using Base::fcn;    (2)
	void fcn() {
		cout << 3 << endl;
	}
};
int main() {

	Derived d;
	d.fcn();   //3
	d.fcn(1);   //error  隐藏掉了    (3)
	system("pause");
}

假如(1)(2) 都注释   那(3)error

using Base::fcn 可以把Base 中的所有重载fcn都给加到我的Derived 里面 ,加到Derived的public部分 就都是public  加到private 就都是private ,  不过注意有个坑,就是 基类的fcn  必须对 派生类都是可访问的,不然gg

比如我把(1)(2)都不注释,那Base 的private 有一个fcn,那using Base::fcn  编译的时候就error了

再一个就是 (1)注释  (2)  不注释      那我的 (3) 就对了 输出的是2

也就知道了,我们可以用 using 把基类的 fcn 都给加进来 ,然后 我再重新定义里面 我想要的重新定义的部分函数

猜你喜欢

转载自blog.csdn.net/speargod/article/details/86631533