C++学习笔记-继承Extend

在 C++ 中,继承(Inheritance)是面向对象编程的核心特性之一,允许一个类(派生类/子类)基于另一个类(基类/父类)构建,并自动获得基类的成员(变量和函数)。继承的核心目标是实现代码复用和多态性。

继承基本语法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Base {
public:
    int x;
protected:
    int y;
private:
    int z;
};

// 派生类继承基类
class Derived : public Base {  // 继承方式(public、protected、private)
public:
    void accessBase() {
        x = 1;    // 可访问基类的 public 成员
        y = 2;    // 可访问基类的 protected 成员
        // z = 3; // 错误!无法访问基类的 private 成员
    }
};

继承的权限

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Base {
public:
    int x;
protected:
    int y;
private:
    int z;
};

// 公有继承
class PublicDerived : public Base {
    // x 是 public
    // y 是 protected
    // z 不可访问
};

// 保护继承
class ProtectedDerived : protected Base {
    // x 是 protected
    // y 是 protected
    // z 不可访问
};

// 私有继承(默认继承方式,若未指定)
class PrivateDerived : private Base {
    // x 是 private
    // y 是 private
    // z 不可访问
};

多重继承与虚继承

一个类可以继承多个基类(不推荐使用多重继承,可能引发二义性)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class A { public: void foo() {} };
class B { public: void foo() {} };

// 继承多个类
class C : public A, public B {
public:
    void callFoo() {
        A::foo();  // 必须明确指定基类,否则会引发二义性,编译器不知道你要调用的是哪个父类的foo方法
        B::foo();
    }
};

可以通过虚继承来解决多重继承中可能产生的二义性问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Base { public: int x; };

// 虚继承,使用 virtual 继承确保共享基类实例
class Der1 : virtual public Base {};
class Der2 : virtual public Base {};

class Final : public Der1, public Der2 {
public:
    void setX(int val) { x = val; }  // 无二义性
};

总结

  1. 继承方式:控制基类成员在派生类中的访问权限。
  2. 构造函数顺序:基类 → 成员 → 派生类。
  3. 多态性:通过虚函数实现运行时绑定。
  4. 多重继承:谨慎使用,优先虚继承解决菱形问题。
  5. 最佳实践:优先使用公有继承,避免过度设计。
updatedupdated2025-03-102025-03-10