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