C++ 继承中的类作用域
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内,也就是说如果一个名字在派生类中无法解析,就会继续在外层基类中解析。
在编译时进行名字查找
即使动态对象和静态对象可能不一致,但是我们能够使用哪些成员是由静态类型决定的。
即我们使用一个基类的指针或引用绑定一个派生类时,即使派生类中确实含有某个成员,但是如果基类不含有这个成员,我们使用基类的指针或引用去调用这个成员时,依旧是错误的。
名字冲突与继承
和普通函数一样,派生类也能重定义基类的名字,此时定义域内将隐藏外层作用域的名字
注:我们可以通过作用域运算符来在派生类的作用域内访问被隐藏的名字。
名字查找优先于类型检查
派生类中重新定义基类中的名字时,即使派生类的参数列表和基类不一样,基类成员也会在调用时被隐藏掉。
虚函数和作用域
现在我们可以理解为什么基类和派生类的虚函数必须具有相同的参数列表了。因为如果参数列表不同的话我们动态绑定时,就无法用基类的引用或指针来使用派生类的虚函数了。
对于上面的a->fcn,由于fcn是虚函数,所以编译器会在运行时判断是谁调用了他,a绑定了D1但是D1没有覆盖不含参数的版本,所以编译器会在外层的Base中调用fcn。
而对于非虚函数
b的fcn为非虚函数所以直接调用D1的fcn(int),c调用D2的fcn(int)
容器和继承
容器中不允许使用不同类型的元素,所以我们不能把具有继承关系的多种类型对象存放在容器中。
如果我们使用基类类型为容器的元素,那么派生类的对象放置在容器中时他就不再是派生类对象了,它的派生部分将会被忽略。
在容器中存放指针而非对象
我们可以把一个派生类的智能指针转换为基类的智能指针。