单继承与多继承
使用单继承建模“是一个”关系,并妥善处理多继承的陷阱
单继承与多继承 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
什么是继承
继承允许一个类(派生类)复用并扩展另一个类(基类)。它用于表示“是一种”关系。
class Animal {
public:
void breathe() { std::cout << "breathing\n"; }
};
class Dog : public Animal {
public:
void bark() { std::cout << "Woof!\n"; }
};公有继承
使用 public 表示“是一种”关系——Dog 是一种 Animal。成员在派生类中会保留其访问级别。
受保护继承和私有继承
protected 和 private 继承用于表示“通过……实现”,但很少使用。在这些情况下,请优先使用组合。
访问 Base 成员
派生类可以直接使用基类的任何公有或受保护成员。
Dog d;
d.breathe(); // inherited from Animal
d.bark(); // own member构造函数顺序
Base 构造函数会先于派生类构造函数运行。请使用成员初始化列表向基类传递参数。
class Pet : public Animal {
std::string name_;
public:
Pet(std::string n) : Animal(), name_(std::move(n)) {}
};析构函数顺序
析构函数会按相反顺序运行——先运行派生类析构函数,再运行基类析构函数。如果通过基类指针删除对象,请将基类析构函数声明为 virtual。
多重继承
C++ 允许一个类继承多个基类。请谨慎使用,因为它会使设计变得复杂。
class Printable { public: virtual void print() = 0; };
class Serializable { public: virtual std::string serialize() = 0; };
class Document : public Printable, public Serializable {
// implements both interfaces
};菱形问题
如果两个基类共享一个公共基类,派生类最终会拥有该基类的两个副本。请使用虚继承来解决。
class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {}; // D has ONE A, not two虚继承的开销
虚基类会增加开销——每个对象需要额外的指针,并且每次访问基类成员时都需要额外的间接寻址。请尽可能避免使用。
组合与继承
通常,“拥有某物”的组合比“是一种”的继承更简单。Car 拥有一个 Engine,因此不要让 Car 继承自 Engine。
class Engine { /* ... */ };
class Car {
Engine engine_; // composition
};接口继承与实现继承
有两种常见用途:
- 接口——从纯虚基类派生,以履行契约
- 实现——通过派生来复用代码(CRTP、混入)
何时使用继承
请在以下情况下使用继承:
- 存在真实的“是一种”关系
- 需要通过虚函数实现运行时多态
- 基类就是为继承而设计的
快速检查
使用多重继承时,哪种技术可以防止公共基类出现两个副本?
总结
公有继承通过“是一种”关系来表示继承。C++ 允许多重继承,但菱形问题需要使用虚继承来解决。对于“拥有某物”的关系和代码复用,请优先使用组合。
常见问题解答
「单继承与多继承」课时是免费的吗?
是的 — 「单继承与多继承」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「单继承与多继承」这节课中我会学到什么?
使用单继承建模“是一个”关系,并妥善处理多继承的陷阱 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「单继承与多继承」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 单继承与多继承
- 虚函数与 vtable
- 抽象类与纯虚方法
- 继承与组合的权衡