Skip to content

继承和派生

  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
    1
    2
    3
    4
    5
       A       A是基类B和C同时继承AD继承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. ||, +=, && 不能重载 (+=好奇怪,但搜出来说不能)