C++构造函数多态使用问题求助:Race类无法识别SportCar
解决你的C++多态与引用成员初始化问题
让我们一步步拆解并解决你遇到的两个核心问题:多态失效和引用成员的编译错误。
问题1:多态失效(最后一行输出不符合预期)
你最初在Race类中使用Car m_Car作为成员变量时,会触发**对象切片(Object Slicing)**问题:
- 当把
SportCar对象传入Race构造函数并赋值给m_Car时,派生类SportCar特有的属性和方法会被"切掉",只保留基类Car的部分。 - 这时候调用
m_Car.Show(),只会执行基类Car的Show()函数,所以最后一行输出是I'm a car而非预期的I'm a sportcar。
要保留多态特性,必须用引用或指针来存储基类类型的对象,这也是你尝试改成Car &m_Car的思路,只是遇到了引用初始化的语法问题。
问题2:引用成员的编译错误
C++对引用成员有严格要求:引用变量必须在构造函数的初始化列表中完成绑定,不能在构造函数体内通过赋值操作初始化。
你原来的Race构造函数写法:
Race::Race(const Car& c, Track t) { m_Car = c; m_Track = t; m_Car.Show(); }
这里m_Car = c是赋值操作,但引用变量在进入构造函数体之前就必须绑定到一个具体对象,因此编译器报错提示你未初始化引用成员。
正确修改方式
将引用成员的初始化移到构造函数的初始化列表中:
Race::Race(const Car& c, Track t) : m_Car(c), m_Track(t) { m_Car.Show(); }
这样m_Car会直接绑定到传入的c对象(也就是你的Ferrari实例),调用Show()时会触发多态,执行SportCar的版本。
额外的头文件笔误修复
你的Track类头文件存在保护宏的笔误,会导致头文件保护失效:
#ifndef TRACK_H #define SPORTCAR_H // 错误:应该是#define TRACK_H class Track { // ... }; #endif // SPORTCAR_H
务必修改为:
#ifndef TRACK_H #define TRACK_H class Track { // ... }; #endif // TRACK_H
最终效果验证
完成以上修改后,程序输出将完全符合你的预期:
I'm a car I'm a sportcar I'm a sportcar I'm a sportcar
内容的提问来源于stack exchange,提问作者user10668111
相关产品推荐
相关产品推荐

