2015-04-27 113 views
0

如您所见,只有基类的流插入操作符的重载版本在两个实例上调用。我明白为什么如此。这是因为没有动态绑定。但是,我该如何解决它?上传和流操作符重载

#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的对象作为它的参数之一?

+0

可能重复的[是否向上转型使过载流运营商(<< && >>)被一定过载作为成员函数和不友元函数?](http://stackoverflow.com/questions/29885965/does-upcasting- make-overloading-the-stream-operators-be-necessary-o) – phantom

+0

那么解决方案在哪里? – User2k14

回答

1

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

要在运行时进行解析,即使用动态分派,您需要将执行打印的代码移至虚拟成员函数。
然后从运营商那里调用(你只需要一个基础类)。

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; 
}