C++ 继承机制详解
继承是 C++ 面向对象编程实现代码复用的核心手段,它允许我们在保持原有类特性的基础上进行扩展,构建出层次分明的类体系。掌握继承机制,对于编写高效、可维护的 C++ 代码至关重要。
继承的概念及定义
继承体现了面向对象程序设计的层次结构。在语法上,以 class Student : public Person 为例,Person 是基类(父类),Student 是派生类(子类),public 则是继承方式。
C++ 支持三种继承方式:public、protected 和 private。不同的继承方式会改变基类成员在派生类中的访问权限。例如,基类的 public 成员在 public 继承下,在派生类中仍是 public;但在 protected 继承下,就变为派生类的 protected 成员。

基类和派生类对象赋值转换
派生类对象和基类对象之间存在特殊的赋值转换关系。派生类对象可以赋值给基类的对象、指针或引用,这就像把派生类中属于基类的那部分'切'出来进行赋值,形象地称为切片(Slicing)。
Student sobj;
Person pobj = sobj; // 对象切片
Person* pp = &sobj; // 向上转型
Person& rp = sobj; // 向上转型
然而,基类对象不能直接赋值给派生类对象。不过,基类的指针或引用可以通过强制类型转换赋值给派生类的指针或引用,但这种转换需要谨慎。若基类是多态类型,建议使用 RTTI(运行时类型信息)的 dynamic_cast 来确保安全转换。
这里涉及两个核心概念:向上转型和向下转型。
- 向上转型(Upcast):子类指针/引用 → 父类指针/引用。这是天然合法、无风险的转换,也是编码中最常用的方式。只要满足公有继承(is-a 关系),编译器会自动处理,绝对安全且是多态的基础。
- 向下转型(Downcast):父类指针/引用 → 子类指针/引用。这是逆向转换,必须手动强制转换,且存在安全风险。如果父类指针原本指向的是父类对象,强行向下转型会触发未定义行为(如程序崩溃)。安全的做法是确保原对象确实是子类实例,或者使用
dynamic_cast进行运行时检测。
注意:
Person& p = sobj;实际上是将子类对象作为父类的别名。无论是赋值、指针还是引用,都遵循上述切片与转型规则。

继承中的作用域
在继承体系中,基类和派生类都有各自独立的作用域。当子类和父类存在同名成员时,子类成员会屏蔽父类对同名成员的直接访问,这种现象称为隐藏(重定义)。
class {
:
_num = ;
};
: Person {
:
_num = ;
:
{
cout << << Person::_num << endl;
cout << << _num << endl;
}
};



















