概述
继承是 C++ 面向对象编程的核心特性之一,它允许在保持原有类特性的基础上进行扩展,从而构建层次化的类结构。掌握继承机制对于编写高效、可维护的代码至关重要。
一、继承的概念及定义
继承通过派生类(子类)复用基类(父类)的成员。定义格式通常为 class Derived : public Base。其中 public 是继承方式,决定了基类成员在派生类中的访问权限。C++ 支持三种继承方式:public、protected 和 private。
- public 继承:基类的 public/protected 成员在派生类中保持原有的访问权限。
- protected 继承:基类的 public 成员变为 protected,protected 成员保持 protected。
- private 继承:基类的所有成员在派生类中都变为 private。
![图示:继承关系示意图]
例如,基类的 public 成员在 public 继承下仍是 public,但在 protected 继承下则变为 protected。
二、基类和派生类对象赋值转换
派生类对象可以赋值给基类对象、指针或引用,这被称为'向上转型'。由于派生类包含基类的所有成员,这种转换是安全的且自动完成。形象地说,这就像把派生类中属于基类的那部分'切'出来进行赋值,称为切片(Slicing)。
Student sobj;
Person pobj = sobj; // 对象切片
Person* pp = &sobj; // 指针向上转型
Person& rp = sobj; // 引用向上转型
反之,基类对象不能直接赋值给派生类对象。若需将基类指针转换为派生类指针(向下转型),必须谨慎处理。如果基类是多态类型,建议使用 dynamic_cast 进行运行时类型检查以确保安全。
向上转型永远安全,是配合虚函数实现多态的基础;向下转型存在风险,仅在确认对象实际类型为派生类时才应使用。
![图示:对象切片示意图]
三、继承中的作用域
在继承体系中,基类和派生类拥有各自独立的作用域。当子类和父类存在同名成员时,子类成员会屏蔽父类对同名成员的直接访问,这种现象称为隐藏(Hiding)。
class Person {
protected:
int _num = 111;
};
class Student : public Person {
protected:
int _num = 999;
public:
void Print() {
cout << "Person::_num: " << Person::_num << endl;
cout << "Student::_num: " << _num << endl;
}
};
在 Student 的 函数中,通过作用域解析运算符 明确访问父类的 成员。实际编程中应尽量避免在继承体系里定义同名成员,以免造成代码理解和维护上的困难。


