问答:
- 什么叫名字遮蔽?
派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,那么就会遮蔽从基类继承过来的成员,这就叫做名字遮蔽。
有一点要提出,对于继承而言,只要名字一样不管形参个数和类型怎样,都构成名字遮蔽。 - 会产生怎样的后果?
派生类并没有继承到基类的重名的成员函数,它用的是自己的成员函数。换句话说,派生类自己的重名函数把基类的给覆盖了,导致派生类自己使用自己的不能使用基类的。 - 派生类非要基类的重名函数怎么办?
这块常用在:派生类调用基类的构造函数来完成自己的构造函数。
首先,派生类是不能继承基类的构造函数的,原因:类名都不一样怎么继承???
所以,想用的话要加上类名和域解析符。 - 进一步而言,派生类调用基类的构造函数,那么基类的成员变量会不会因此而改变?
答案是明确的,不会。原因:基类和派生类是两个不同的作用域,
派生类仅仅是调用了基类的构造函数,基类的成员变量又不是全局变量,怎么会因为派生类的调用就改变了呢?这里要明确一下基类构造函数的作用:用来初始化基类成员变量的
总结:
在单继承里,名字遮蔽是指派生类的重名成员遮蔽基类的;
只要名字一样不管形参个数和类型怎样,都构成名字遮蔽;
想要在派生类中使用基类的遮蔽成员,加上基类的类名和域解析符。
基类实例化的对象和派生类实例化的对象是两个不同的存储单元,不用担心派生类调用基类的构造函数初始化自己的成员变量时会改变基类的成员变量。