C++类B继承类A仅显示int成员,string成员不显示的原因
问题原因及解决思路
核心原因1:友元函数无法访问继承来的protected成员
你重载的>>和<<运算符如果是类B的友元函数,它们只能直接访问B自身的成员,没法直接触碰从A继承来的protected成员(包括string和int类型)。那为什么int的age、ph_no能显示?大概率是你在类B里重复定义了这两个同名int成员,或者误打误撞通过其他方式(比如B的成员函数)给它们赋了值,而string类型的成员没被正确赋值,所以输出为空。
核心原因2:输入逻辑的字符分隔问题
如果你的输入用空格、换行符分隔字段,cin >> string会在遇到第一个空白字符时停止读取。比如输入Alice 2000-01-01 alice@xxx.com CS 20 1234567890 101,cin >> name只会读到Alice,后续的dob、email等string成员会被跳过;但int类型的读取会自动跳过空白字符,所以能正常读入,最终出现string为空、int正常显示的差异。
解决办法
- 让基类开放访问权限:在类A中把重载的
>>和<<声明为友元,这样它们就能直接访问A的protected成员。 - 派生类提供接口:在类B中编写public的get/set函数,比如
void set_name(const string& n) { name = n; },让重载的输入输出运算符通过这些函数操作继承来的成员。 - 修正输入逻辑:如果string包含空格,使用
getline(cin, name)读取,但要注意先通过cin.ignore()处理cin残留的换行符。
内容的提问来源于stack exchange,提问作者Parth Pawar
相关产品推荐
相关产品推荐

