C++ 重载运算符<&书信电报;在派生类中

C++ 重载运算符<&书信电报;在派生类中,c++,inheritance,operator-overloading,pure-virtual,C++,Inheritance,Operator Overloading,Pure Virtual,假设我有两个类,其中一个是抽象的,另一个是真实的,派生的另一个的子类。它们都重载了操作符,这就是需要进行类型转换的地方 std::ostream& operator << (std::ostream& out, const Derived& instance) { out << "derived "; out << (const Parent &)instance; // Alternative 1:

假设我有两个类,其中一个是抽象的,另一个是真实的,派生的另一个的子类。它们都重载了
操作符,这就是需要进行类型转换的地方

std::ostream& operator << (std::ostream& out, const Derived& instance)
{
     out << "derived ";
     out << (const Parent &)instance;    // Alternative 1: C style cast
     out << static_cast<const Parent &>(instance);   // Alternative 2
     return out;
}

std::ostream&operator这就是您需要进行类型转换的地方

std::ostream& operator << (std::ostream& out, const Derived& instance)
{
     out << "derived ";
     out << (const Parent &)instance;    // Alternative 1: C style cast
     out << static_cast<const Parent &>(instance);   // Alternative 2
     return out;
}

std::ostream&operator有两种方法可以多态地执行此操作:


  • 调用
    有两种方法以多态方式执行此操作:


    • 调用
      您可以创建对父类的引用而无需实例化它。
      out您可以创建对父类的引用而无需实例化它。
      out这是我的第一个想法,但我没有仔细查看我的类型。我以前做过<代码>,你不应该在C++中使用C-Casts!!绝对不是这里。实际上不需要向上投射,因为向下投射应该使用动态投射。@DrumM-阅读OP的问题。他想要
      运算符我的意思是,您根本不需要强制转换,因为父级和派生级是多态的。问题在于调用重载函数的适当重载。多态性并不能解决这个问题。这是我的第一个想法,但我没有仔细检查我的类型。我以前做过<代码>,你不应该在C++中使用C-Casts!!绝对不是这里。实际上不需要向上投射,因为向下投射应该使用动态投射。@DrumM-阅读OP的问题。他想要
      运算符我的意思是,您根本不需要强制转换,因为父级和派生级是多态的。问题在于调用重载函数的适当重载。多态性并不是解决这个问题的方法。当尝试输入时,与第二种方法的权衡就出现了。为了正确地输入对象,需要(通常)计算出实际输出的对象类型。这可能意味着需要输出标识类型的信息。@Peter此方法仅适用于输出,不适用于输入。在实例存在之前,没有任何信息可以将执行流引导到适当的成员函数,因此应该首选特定于类型的重载。在尝试输入时,需要权衡第二种方法。为了正确地输入对象,需要(通常)计算出实际输出的对象类型。这可能意味着需要输出标识类型的信息。@Peter此方法仅适用于输出,不适用于输入。在实例出现之前,没有任何信息可以将执行流引导到适当的成员函数,因此最好使用特定于类型的重载。
      
      class Parent {
          virtual void open() = 0;
      protected:
          virtual std::ostream&  format(std::ostream& out) const {
              out << "hello" << endl;
              return out;
          }
          friend std::ostream& operator << (std::ostream& out, const Parent& instance);
      };
      
      class Derived : public Parent {
          void open();
          std::ostream&  format(std::ostream& out) const override {
              out << "derived" << endl;
              return Parent::format(out);
          }
      };
      
      std::ostream& operator << (std::ostream& out, const Parent& instance) {
          // Forward the call to a virtual member function
          return instance.format(out);
      }