C++类的继承和派生
一、继承基本概念
-
继承机制:通过已有类(基类/父类)创建新类(派生类/子类),实现代码重用和扩展
-
继承关系:
• 基类 → 提供基础功能• 派生类 → 继承基类成员 + 新增特有成员
-
继承优势:
• 减少代码冗余• 提高开发效率
• 增强程序扩展性
二、继承类型
- 单继承:仅从一个基类派生
class Derived : public Base { ... };
- 多继承:从多个基类派生
class Derived : public Base1, protected Base2 { ... };
三、访问控制与继承方式
继承方式 | 基类public成员 | 基类protected成员 | 基类private成员 |
---|---|---|---|
public | public | protected | 不可访问 |
protected | protected | protected | 不可访问 |
private | private | private | 不可访问 |
四、构造与析构机制
-
执行顺序:
• 构造函数:基类 → 成员对象 → 派生类• 析构函数:派生类 → 成员对象 → 基类
-
派生类构造函数格式:
Derived(参数表) : Base1(参数), Base2(参数), 成员对象(参数) { ... }
五、多继承的挑战与解决方案
-
二义性问题:
• 表现:多个基类存在同名成员• 解决方案:
对象.基类名::成员 // 显式指定作用域
-
菱形继承问题:
• 表现:派生类包含重复基类成员• 解决方案:虚继承(virtual inheritance)
class B : virtual public A { ... }; class C : virtual public A { ... }; class D : public B, public C { ... };
六、特殊继承技术
-
虚基类特性:
• 确保派生类只保留一份基类副本• 最终派生类需直接调用虚基类构造函数
-
抽象类:
• 包含纯虚函数的类(virtual void func() = 0;)• 不可实例化,用于接口定义
七、类型兼容规则
- 派生类对象可赋值给基类对象
- 基类指针/引用可指向派生类对象
Base* p = new Derived();
八、设计实践要点
- 优先使用public继承(符合IS-A关系)
- 谨慎使用多继承,优先组合代替继承
- 虚函数与继承结合实现运行时多态
- 遵循"基类析构函数应为虚函数"原则
示例问题解决方案:
原Student和CollegeStudent类可通过继承优化:
class Student {
public:void display() { /* 显示num和name */ }
protected:int num;string name;
};class CollegeStudent : public Student {
public:void display() { Student::display(); // 重用基类方法cout << speciality; // 新增特性}
private:string speciality;
};
通过继承复用num和name成员,避免代码重复,符合面向对象设计原则。