C++重载operator<<后输出对象地址而非属性值,如何修正?
问题分析与解决
核心错误原因
你直接输出的是指针变量本身,而非指针指向的对象。person_obj_1是Properties*类型(指针),C++标准库中ostream的默认operator<<对指针的处理就是输出其内存地址,不会自动调用你为Person类重载的版本。
基础修复方案
对指针进行解引用,让编译器匹配你重载的operator<<(ostream&, const Person&):
int main() { Properties* person_obj_1 = new Properties(); person_obj_1 = add_person(person_obj_1); cout << *person_obj_1 << "\n"; // 添加*解引用指针 delete person_obj_1; // 记得释放内存,避免泄漏 }
因为Properties公有继承自Person,派生类对象可以隐式转换为const Person&,所以解引用后会调用你写的基类输出逻辑。
进阶:支持多态输出(如果Properties有自身属性需要打印)
如果Properties类有自己的成员变量需要输出,上述方案只能打印基类Person的属性。要实现多态输出,需要借助虚成员函数(友元不能是虚函数):
- 修改
Person类,添加虚打印函数:
class Person { private: string name; int egn; string adress; public: // 虚函数,派生类可以重写 virtual void print(ostream& out) const { out << "Person name: " << name << "\nPerson egn: " << egn; } // 友元运算符调用虚函数 friend ostream& operator << (ostream& out, const Person& c); }; ostream& operator << (ostream& out, const Person& c) { c.print(out); return out; }
- 在
Properties类中重写print函数:
class Properties : public Person { private: // 假设Properties有自己的属性,比如身高 int height; public: void print(ostream& out) const override { // 先调用基类的print输出基类属性 Person::print(out); // 再输出自身属性 out << "\nProperties height: " << height; } };
这样解引用指针输出时,会根据对象实际类型调用对应的print函数,实现多态输出。
内容的提问来源于stack exchange,提问作者radoslav pavlov
相关产品推荐
相关产品推荐

