1、在继承体系中,很少用private,一般使用都是public继承
2、权限大小关系:public > protected > private.
3、对于访问修饰限定符,如果不写,默认struct中成员默认是public,class默认是private. 对于继承也一样,struct中默认的继承方式是public;class默认的是private,但是最好显式写出。
4、赋值兼容规则 - 切片,把子类中父类那部分切来赋值过去。
Person p; Student s; //1.父类 = 子类 p = s; Person* ptr = &s; Person& ref = s;
5、1. 在继承体系中,父类和子类具有独立的作用域。因此,同名成员可以同时存在。
6、若子类与父类有同名成员,由局部优先原则,子类会屏蔽父类,优先访问自己类中的成员;若想访问父类成员,需要指定作用域。这种情况就叫隐藏/重定义。
7、构造析构:父类成员调用父类的来处理,自己的成员按普通类处理。
8、子类析构函数结束时,会自动调用父类的析构函数,这样才能保证先析构子类成员,后析构父类成员。
9、友元关系不能继承。父类的友元,不是子类的友元。
10、多继承看起来很合理,一个类继承多个类,但其实它就是一个坑( Java等语言直接没有多继承,避开这个坑),它带来的菱形继承,一个研究生助教对象中有两份Person,会有数据冗余和二义性的问题。
11、为了解决解决菱形继承的二义性和数据冗余的问题,C++付出了极大的代价,虚继承。
12、一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。
13、继承是白箱复用(white-box reuse),父类成员除了私有的不可见,公有和保护对子类都是透明的可以直接访问(事实上,继承中要复用很少定义私有),因此白箱复用在一定程度上破坏了封装;组合是黑箱复用(black-box reuse),D只能访问C的公有,不能访问保护,和在类外的对象一样。



