全局运算符和多态性

Won*_*abo 6 c++ polymorphism operators

我有两个班,两个全球friend oparator<<.

class A {
    friend std::ostream& operator<<(std::ostream& o, const A &a);
};

class B: public A {
    friend std::ostream& operator<<(std::ostream& o, const B &b);
};
Run Code Online (Sandbox Code Playgroud)

如果我像这样使用它,一切正常,B操作符的版本被调用:

B b;
std::cout << b;
Run Code Online (Sandbox Code Playgroud)

但是如果我使用多态,那么A版本会被调用,尽管动态类型是B:

A* b = new B();
std::cout << *b;
Run Code Online (Sandbox Code Playgroud)

一种解决方案是铸造:

std::cout << static_cast<B&>(*b);
Run Code Online (Sandbox Code Playgroud)

但是有没有更简单或更优雅的解决方案呢?

For*_*veR 10

是.一个输出操作符和virtual print类中的函数.

class A
{
public:
   virtual ~A() {}
private:
   virtual void print(std::ostream&) {}
   friend std::ostream& operator << (std::ostream& os, const A& obj)
   {
      obj.print(os);
      return os;
   }
};

class B
{
private:
   virtual void print(std::ostream&) {}
};
Run Code Online (Sandbox Code Playgroud)

实例