0Pricing
C++ Academy · 课时

单继承与多继承

使用单继承建模“是一个”关系,并妥善处理多继承的陷阱

单继承与多继承 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 单继承与多继承
  2. 虚函数与 vtable
  3. 抽象类与纯虚方法
  4. 继承与组合的权衡
← 返回 C++ Academy