You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的属性。要实现多态输出,需要借助虚成员函数(友元不能是虚函数):

  1. 修改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;
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:05:17