在 C++ 的 面向对象编程(OOP) 中,三大核心特性是:
封装(Encapsulation)
继承(Inheritance)
多态(Polymorphism)
继承是其中非常重要的一部分,它可以让 一个类复用另一个类的属性和行为,从而提高代码复用性和扩展性。
一、什么是继承(Inheritance)
继承指的是:
一个类(子类 / 派生类)可以继承另一个类(父类 / 基类)的成员变量和成员函数。
基本思想:
父类:通用属性
子类:扩展功能
例如:
动物 Animal
|
├── 狗 Dog
└── 猫 Cat
Dog 和 Cat 可以继承 Animal 的通用行为。
二、继承的基本语法
在 C++ 中继承的基本语法:
class 子类名 : 继承方式 父类名
{
};
示例:
#include <iostream>
using namespace std;
class Animal {
public:
void eat() {
cout << "Animal eating" << endl;
}
};
class Dog : public Animal {
public:
void bark() {
cout << "Dog barking" << endl;
}
};
int main() {
Dog d;
d.eat();
d.bark();
return 0;
}
输出:
Animal eating
Dog barking
说明:
Dog继承了Animal的eat()函数
三、继承方式(重点)
在 C++ 中有 三种继承方式:
| 继承方式 | 父类public | 父类protected | 父类private |
|---|---|---|---|
| public继承 | public | protected | 不可访问 |
| protected继承 | protected | protected | 不可访问 |
| private继承 | private | private | 不可访问 |
1 public继承(最常用)
特点:
父类public → 子类public
父类protected → 子类protected
示例:
class Base {
public:
int a;
protected:
int b;
};
class Derived : public Base {
};
访问情况:
Derived可以访问a和b
外部对象只能访问a
2 protected继承
规则:
父类public → 子类protected
父类protected → 子类protected
示例:
class Derived : protected Base
{
};
特点:
外部对象无法访问Base成员
3 private继承
规则:
父类public → 子类private
父类protected → 子类private
示例:
class Derived : private Base
{
};
特点:
父类成员对子类私有
四、继承中的构造函数
子类创建对象时,父类构造函数会先执行。
示例:
#include <iostream>
using namespace std;
class Base {
public:
Base() {
cout << "Base constructor" << endl;
}
};
class Derived : public Base {
public:
Derived() {
cout << "Derived constructor" << endl;
}
};
int main() {
Derived d;
}
输出:
Base constructor
Derived constructor
顺序:
父类构造 → 子类构造
析构顺序:
子类析构 → 父类析构
五、继承中的成员同名问题
如果子类和父类有同名成员:
示例:
class Base {
public:
int num = 10;
};
class Derived : public Base {
public:
int num = 20;
};
访问:
Derived d;
cout << d.num << endl;
cout << d.Base::num << endl;
输出:
20
10
说明:
子类成员会隐藏父类成员
六、多继承
C++ 支持一个类继承多个父类。
示例:
class A {
public:
void funcA() {
cout << "A" << endl;
}
};
class B {
public:
void funcB() {
cout << "B" << endl;
}
};
class C : public A, public B {
};
使用:
C c;
c.funcA();
c.funcB();
七、菱形继承(经典问题)
结构:
A
/ \
B C
\ /
D
问题:
D会继承A两次
解决方案:
使用 虚继承(virtual inheritance)。
示例:
class A {
public:
int num;
};
class B : virtual public A {
};
class C : virtual public A {
};
class D : public B, public C {
};
这样:
D只保留一份A
八、继承的优点
继承的核心优势:
1️⃣ 代码复用
避免重复代码。
2️⃣ 层次结构清晰
动物 → 哺乳动物 → 狗
3️⃣ 方便扩展
新增子类即可。
九、继承的缺点
继承也存在一些问题:
1️⃣ 耦合度高
子类依赖父类。
2️⃣ 层级过深难维护
A → B → C → D → E
3️⃣ 多继承复杂
可能产生菱形问题。
十、继承 vs 组合
软件设计中常有一句经典原则:
优先使用组合,而不是继承
继承:
is-a
例如:
Dog is a Animal
组合:
has-a
例如:
Car has a Engine
总结
C++继承核心知识:
继承三要点
├── 继承语法
├── 三种继承方式
└── 构造与析构顺序
重要概念:
public继承(最常用)
多继承
菱形继承
虚继承
一句话理解:
继承就是在已有类基础上扩展新功能,实现代码复用。
如果你愿意,我可以再给你整理一份 C++面向对象核心知识(封装 + 继承 + 多态 + 虚函数)一张图彻底讲清楚,很多 C++ 面试都会考。