gpt4 book ai didi

c++ - 重载 << 运算符和继承类

转载 作者:可可西里 更新时间:2023-11-01 16:37:05 25 4
gpt4 key购买 nike

我有一个基类,然后是几个派生类。我想为这些派生类重载“<<”运算符。对于普通运算符,即“+”,虚函数可以解决问题。我理解的标准约定是声明

friend ostream& operator<<(ostream& out, MyClass& A);

在我的类中,然后在类之后定义函数。我先验地认为将 virtual 添加到上述定义会使它起作用,但经过一番思考(以及我的编译器的错误)我意识到这没有多大意义。

我在一个测试用例上尝试了不同的策略,其中所有类成员都是公开的。例如:

class Foo{
//bla
};

ostream& operator<<(ostream& out, Foo& foo){
cout << "Foo" << endl;
return foo;
}

class Bar : public Foo{
//bla
};

ostream& operator<<(ostream& out, Bar& bar){
cout << "Bar" << endl;
return bar;
}

///////////////////////

Bar bar = Bar();
cout << bar << endl; // outputs 'Foo', not 'Bar'

所以在某种程度上这是“多态性变坏了”——基类运算符<<被调用而不是派生类运算符。在上面的示例中,如何为派生类调用正确的运算符?更一般地说,如果我的类有我想保护的私有(private)成员,我该如何在使用 friend 关键字时更正运算符重载?

最佳答案

您可以使用虚拟辅助函数。这是一个完全未经测试的示例,请原谅任何语法错误:

virtual ostream& Foo::print(ostream& out) const {
return out << "Foo";
}

virtual ostream& Bar::print(ostream& out) const {
return out << "Bar";
}

// If print is public, this doesn't need to be a friend.
ostream& operator<<(ostream& out, const Foo& foo) {
return foo.print(out);
}

编辑根据@Omnifarious 建议清理。

关于c++ - 重载 << 运算符和继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com