1. C++继承的基本概念
继承是面向对象编程中最重要的特性之一,它允许我们基于已有的类创建新类。在C++中,继承机制使得代码重用成为可能,同时也为多态性提供了基础。
想象一下生物界的遗传现象 - 孩子会继承父母的某些特征,同时又有自己独特的属性。C++中的继承也是类似的逻辑。基类(父类)定义了通用的属性和行为,而派生类(子类)可以继承这些特性,并添加自己特有的功能。
C++支持多种继承方式:
- 单继承:一个派生类只从一个基类继承
- 多继承:一个派生类从多个基类继承
- 多层继承:形成继承链,如A→B→C
注意:多继承虽然强大,但也容易导致"菱形继承"等问题,需要谨慎使用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 继承的语法与访问控制
C++中继承的基本语法如下:
cpp复制class 派生类名 : 访问说明符 基类名 {
// 派生类成员
};
访问说明符决定了基类成员在派生类中的可见性:
- public继承:基类的public成员在派生类中保持public,protected保持protected
- protected继承:基类的public和protected成员在派生类中都变为protected
- private继承:基类的public和protected成员在派生类中都变为private
实际开发中最常用的是public继承,因为它保持了"是一个"的关系。例如:
cpp复制class Animal {
public:
void eat() { cout << "Eating..." << endl; }
};
class Dog : public Animal {
public:
void bark() { cout << "Woof!" << endl; }
};
int main() {
Dog myDog;
myDog.eat(); // 继承自Animal
myDog.bark(); // Dog自己的方法
}
3. 构造函数与析构函数在继承中的行为
构造函数和析构函数在继承体系中有特殊的行为规则:
- 构造顺序:基类→派生类成员→派生类构造函数体
- 析构顺序:与构造顺序相反
当创建派生类对象时:
- 如果基类有默认构造函数,它会自动被调用
- 如果基类没有默认构造函数,必须在派生类构造函数的初始化列表中显式调用基类构造函数
cpp复制class Base {
public:
Base(int x) : value(x) {}
private:
int value;
};
class Derived : public Base {
public:
Derived(int x, int y) : Base(x), extra(y) {}
private:
int extra;
};
经验之谈:在复杂的继承体系中,务必理清构造和析构的顺序,避免资源泄漏或未定义行为。
4. 函数重写与多态性
派生类可以重写(override)基类的虚函数,这是实现运行时多态的关键:
cpp复制class Shape {
public:
virtual void draw() { cout << "Drawing a shape" << endl; }
virtual ~Shape() {} // 虚析构函数很重要!
};
class Circle : public Shape {
public:
void draw() override { cout << "Drawing a circle" << endl; }
};
int main() {
Shape* shape = new Circle();
shape->draw(); // 输出"Drawing a circle"
delete shape;
}
关键点:
- 使用virtual关键字声明虚函数
- 派生类中使用override明确表示重写(C++11起)
- 基类析构函数应该是虚函数,确保正确释放资源
- 纯虚函数(=0)使类成为抽象类,不能实例化
5. 多重继承与虚继承
C++支持多重继承,即一个类可以继承自多个基类:
cpp复制class InputDevice { /*...*/ };
class OutputDevice { /*...*/
