在 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; } // 无二义性
};
|
- 继承方式:控制基类成员在派生类中的访问权限。
- 构造函数顺序:基类 → 成员 → 派生类。
- 多态性:通过虚函数实现运行时绑定。
- 多重继承:谨慎使用,优先虚继承解决菱形问题。
- 最佳实践:优先使用公有继承,避免过度设计。