继承和派生

  1. 默认成员是可以被继承的
  2. 继承时,最安全的访问说明符是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
    }
  3. 当父类的成员是受保护的,子类使用私有继承,那么只有最近的子类可以继承受保护的成员,而且这些成员在子类中会变成私有的,更远的继承关系无法继承这些成员(但内存还是会分配的)
    当父类成员是私有的,子类怎么都继承不来,除非改父类
  4. 在多级继承中,父类/超类的公有成员,会一直继承下去
  5. 菱形继承,也能叫成Diamond Problem
    A A是基类,B和C同时继承A,D继承B和C
    / \ 只能发生在A B C声明了虚函数并且有override,而且D没有声明这个虚函数的情况
    B C 因为这种情况下,编译器就不知道D到底使用B还是C声明的虚函数
    \ / Hybrid的继承方式导致了Diamond Problem
    D
  6. enclosing class: 外围类(in java)
    nested class: 嵌套类,和外围类是相对的概念
  7. 单级继承(single inheritance):派生类只有一个基类;派生类必须实现所有的抽象方法
    Single level inheritance supports runtime inheritance
    分层继承(hierarchical inheritance):一个以上的类从基类继承
    多继承(multiple inheritance):派生类可以有两个或多个基类
    多级继承(multi-level inheritance):子子孙孙无穷尽也(bushi),但一个类只继承自一个类
  8. ||, +=, && 不能重载(+=好奇怪,但搜出来说不能)