第二节 · 宗族的继承 · 基类与派生类

继承是面向对象的核心概念之一,它允许我们基于已有的类创建新类,复用代码并建立类之间的层次关系。


基本继承

// 基类(父类)
class Animal
{
protected:
    string name;
    
public:
    Animal(const string& n) : name(n) {}
    
    void eat()
    {
        cout << name << " is eating." << endl;
    }
};

// 派生类(子类)
class Dog : public Animal
{
public:
    Dog(const string& n) : Animal(n) {}  // 调用基类构造函数
    
    void bark()
    {
        cout << name << " says: Woof!" << endl;
    }
};

int main()
{
    Dog d("Buddy");
    d.eat();   // 继承自 Animal
    d.bark();  // Dog 自己的方法
    
    return 0;
}

继承方式

继承方式
基类 public
基类 protected
基类 private

public

public

protected

不可访问

protected

protected

protected

不可访问

private

private

private

不可访问

最常用的是 public 继承。


构造和析构顺序

规则:构造从基类到派生类,析构从派生类到基类。


方法覆盖


调用基类构造函数


protected 成员


多层继承


is-a 关系

继承表达的是 "is-a" 关系:

如果不是 "is-a" 关系,考虑用组合而非继承:


隐藏基类成员

using 声明可以恢复:


习题

  • 设计一个形状类层次结构:Shape → Rectangle, Circle, Triangle。

  • 解释 public、protected、private 继承的区别。

  • 什么时候应该用继承,什么时候用组合?

Last updated