C++如何将基类A对象的数据传递给派生类B的实例对象
现有代码问题说明
- 语法层面错误:
readData函数中cin >> Name >> Surname >> ;末尾多了冗余的>>运算符,编译不通过- 两个类定义结束后未加结尾分号,C++类定义语法要求必须携带
main函数中b.printData()调用末尾缺少分号
- 逻辑层面错误:
- Bar的构造函数参数为
Foo a,但内部赋值语句Name = Name实际是将当前对象的Name成员赋值给自己,完全没有用到传入的基类对象a的数据,无法完成数据迁移
- Bar的构造函数参数为
正确实现方案
要实现基类实例到派生类实例的数据传递,有两种规范写法,推荐优先用第二种初始化列表调用基类拷贝构造的方式,执行效率更高,代码更简洁:
方案1:显式赋值基类成员
因为Bar是Foo的公有派生类,可以直接访问Foo的protected成员,直接读取传入的Foo对象的对应成员赋值即可:
#include <iostream> #include <string> using namespace std; class Foo { protected: string Name, Surname; public: void readData() { cin >> Name >> Surname; } }; class Bar : public Foo { public: Bar(Foo a) { // 直接读取传入基类对象的protected成员赋值给当前实例的对应成员 Name = a.Name; Surname = a.Surname; } void printData() { cout << Name << " " << Surname << endl; } }; int main() { Foo a; a.readData(); Bar b(a); b.printData(); return 0; }
方案2:初始化列表调用基类拷贝构造(更推荐)
派生类构造时会先调用基类的构造函数,直接在初始化列表阶段将传入的基类对象传给基类的默认拷贝构造函数,自动完成基类部分的数据拷贝,不需要手动赋值每个成员:
#include <iostream> #include <string> using namespace std; class Foo { protected: string Name, Surname; public: void readData() { cin >> Name >> Surname; } }; class Bar : public Foo { public: // 初始化列表调用基类Foo的拷贝构造函数,自动完成基类数据迁移 Bar(Foo a) : Foo(a) { // 这里只需要处理派生类自己的新增成员即可,如果没有就留空 } void printData() { cout << Name << " " << Surname << endl; } }; int main() { Foo a; a.readData(); Bar b(a); b.printData(); return 0; }
实现说明
- 方案2的优势是当基类成员较多时,不需要逐个手动赋值,避免漏写成员的问题
- 如果后续Foo类新增了protected或者public成员,方案2不需要修改Bar的构造函数就能自动完成新成员的拷贝,可维护性更好
内容的提问来源于stack exchange,提问作者dapet
相关产品推荐
相关产品推荐

