同名隐藏
一旦子类定义了与父类同名的方法,则父类里面该名字的所有方法都被隐藏了。必须显示指定是父类的方法才可以
#include<iostream> using namespace std; class Base { public: Base() :x(0) {} ~Base() {} void show() { cout << "This is Base show" << endl; } void show(int n) { cout << "This is Base show" << n << endl; } private: int x; }; class D :public Base { public: D() :y(0) {} ~D() {} void show() { cout << "This is D show" << endl; } private: int y; }; void main() { D d; d.show(); d.Base::show(10); }
赋值兼容规则
在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。它包括以下情况:
①派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的隐藏对象赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。
Base b; D d; b = d; d = b;//不能赋值
对象切片
②可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的隐藏对象,不能访问派生类中的新成员。同样也不能反过来做。
D d; Base *pb = &d; pb->show(); pb->show(10); pb->list();//访问不了
pb只能访问Base这个父类内部的方法。不能访问子类里面的show和list
③派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的隐藏对象。
D d; Base &rb = d; rb.show(); rb.show(10); rb.list();//访问不了