继承和派生
-
默认成员是可以被继承的
-
继承时,最安全的访问说明符是private,不管任何情况下子类都无法访问,但default可能存在特例 protected也很安全,但不能说是最安全 要注意,受保护的成员是不能直接通过对象名访问的,不管是在子类还是父类都不行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
class A { protected: int marks; void isprotected() {} public: A() {} void ispublic() {} }; class B : protected A { }; int main() { A a; a.ispublic(); // ok a.isprotected(); // error B b; b.ispublic(); // error b.isprotected(); // error }
- 当父类的成员是受保护的,子类使用私有继承,那么只有最近的子类可以继承受保护的成员,而且这些成员在子类中会变成私有的,更远的继承关系无法继承这些成员(但内存还是会分配的) 当父类成员是私有的,子类怎么都继承不来,除非改父类
- 在多级继承中,父类/超类的公有成员,会一直继承下去
- 菱形继承,也能叫成Diamond Problem
1 2 3 4 5
A A是基类,B和C同时继承A,D继承B和C / \ 只能发生在A B C声明了虚函数并且有override,而且D没有声明这个虚函数的情况 B C 因为这种情况下,编译器就不知道D到底使用B还是C声明的虚函数 \ / Hybrid的继承方式导致了Diamond Problem D
-
enclosing class: 外围类(in java) nested class: 嵌套类,和外围类是相对的概念
-
单级继承(single inheritance):派生类只有一个基类;派生类必须实现所有的抽象方法
Single level inheritance supports runtime inheritance
分层继承(hierarchical inheritance):一个以上的类从基类继承
多继承(multiple inheritance):派生类可以有两个或多个基类
多级继承(multi-level inheritance):子子孙孙无穷尽也(bushi),但一个类只继承自一个类
-
||, +=, && 不能重载 (+=好奇怪,但搜出来说不能)