派生类对象可绑定到基类引用,但仅限public继承且需满足cv限定符匹配;临时对象只能绑定const引用,私有/保护继承时隐式转换不可用。

派生类对象可以直接绑定到基类引用,但必须是 const 引用或非 const 引用 + 满足可访问、可转换条件
能绑,但不是所有情况都行得通。关键看三点:继承关系是否公有、基类析构函数是否虚(影响后续生命周期)、引用类型是否匹配 cv 限定符。
最常见错误是试图把派生类对象绑定到 Base&,而该对象是临时对象或已析构——编译器会直接报错,比如:error: invalid initialization of non-const reference。
- 公有继承下,
Derived d;可以安全绑定到Base& b = d; - 如果是临时对象,如
Base& b = Derived();,编译失败;必须写成const Base& b = Derived(); - 私有/保护继承时,隐式转换不成立,需显式
static_cast(但通常不该这么做)
绑定后调用虚函数没问题,但普通成员函数和数据成员受限于引用的静态类型
引用的静态类型是 Base,所以你只能访问 Base 中声明的成员。哪怕实际对象是 Derived,也不能直接点出 Derived 特有的函数或字段。
虚函数调用走的是动态绑定,没问题;但普通函数(非 virtual)和数据成员访问,全按 Base 的定义来解析。
立即学习“C++免费学习笔记(深入)”;
-
b.func()→ 若func是 virtual,执行Derived::func();否则执行Base::func() -
b.data→ 只能访问Base::data,即使Derived有同名字段也不会被选中 - 想访问派生类特有接口?得用
dynamic_cast向下转型(前提是基类有虚函数)
别忽略对象生命周期 —— 引用不能延长临时对象的生命,除非是 const 左值引用
这是最容易踩的坑:以为 const Base& r = Derived(); 能让你安全用 r,其实它只延长了临时 Derived() 的生命到该引用作用域结束;一旦离开作用域,r 就悬空。
-
const Base& getRef() { return Derived(); }→ 错!返回悬垂引用 -
auto&& r = Derived();(万能引用)也不行,同样悬垂 - 真要返回,得返回对象本身、智能指针,或者确保源对象活得比引用久
多继承时绑定到某个基类引用,编译器自动计算偏移,但要求该基类是“可访问且明确的”
如果 Derived 同时继承 Base1 和 Base2,那么 Base1& b1 = d; 合法,Base2& b2 = d; 也合法;但若两个基类名字相同(比如都叫 Interface),就会触发二义性错误:error: ambiguous conversion。
- 解决二义性:显式指定,如
static_cast<base1>(d)</base1> - 虚继承能避免菱形继承中的重复子对象,但不改变引用绑定规则
- 注意:引用绑定不触发构造/拷贝,只是取地址+偏移调整,零开销


















