首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >上行和流运算符重载

上行和流运算符重载
EN

Stack Overflow用户
提问于 2015-04-27 10:44:06
回答 1查看 165关注 0票数 0

正如您所看到的,在两个实例上都只调用基类的流插入运算符的重载版本。我明白为什么会这样。这是因为没有动态绑定。但是,我该如何修复它呢?

代码语言:javascript
运行
复制
#include <iostream>

using namespace std;

class A {
    int i;
    char c;
public:
    A(int i = 0, char c = ' ') {
        this->i = i;
        this->c = c;
    }
    int getI() { return i; }
    char getC() { return c; }
    friend ostream& operator << (ostream&, A&);
};

class B : public A {
    double d;
public:
    B(int i = 0, char c = ' ', double d = 0.0) : A(i, c), d(d) {}
    friend ostream& operator << (ostream&, B&);
};

ostream& operator << (ostream& out, A& a) {
    out << "\nInteger: " << a.i << "\nCharacter: " << a.c << endl;
    return out;
}

ostream& operator << (ostream& out, B& b) {
    out << "\nInteger: " << b.getI() << "\nCharacter: " << b.getC() << "\nDouble: " << b.d << endl;
    return out;
}

int main() {
    A* a = new A (10, 'x');
    B* b = new B(20, 'y', 5.23);
    A* array[] = { a, b };
    cout << *(array[0]);
    cout << "\n______________________________\n";
    cout << *(array[1]);
    delete a;
    delete b;
    cin.get();
    return 0;
}

如何让cout << *(array[1]);调用重载的流插入操作符,该操作符将B的对象作为其参数之一?

EN

回答 1

Stack Overflow用户

发布于 2015-04-27 13:22:51

您不能让它调用重载操作符,因为重载是在编译时解决的。

要在运行时执行解析,即使用动态分派,您需要将执行打印的代码移动到虚拟成员函数。

然后从运算符调用它(对于基类,您只需要一个)。

代码语言:javascript
运行
复制
class A
{
  public:
    // ...
    // Override this in B
    virtual void print(std::ostream& o) const
    {
        o << "\nInteger: " << i << "\nCharacter: " << c << endl;
    }
    // ...
};

ostream& operator << (std::ostream& out, const A& a) {
    a.print(out);
    return out;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29886351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档