使运营商<<虚拟?

inn*_*sas 40 c++ virtual operator-overloading operators

我需要使用虚拟<<运算符.但是,当我尝试写:

virtual friend ostream & operator<<(ostream& os,const Advertising& add);
Run Code Online (Sandbox Code Playgroud)

我得到编译器错误

错误1错误C2575:'operator <<':只有成员函数和基数可以是虚拟的

如何将此运算符设为虚拟?

tem*_*def 73

这个设置的问题是上面定义的操作符<<是一个自由函数,它不能是虚函数(它没有接收者对象).为了使函数成为虚函数,必须将其定义为某个类的成员,这在这里是有问题的,因为如果将operator <<定义为类的成员,则操作数的顺序将错误:

class MyClass {
public:
    virtual ostream& operator<< (ostream& out) const;
};
Run Code Online (Sandbox Code Playgroud)

意思是

MyClass myObject;
cout << myObject;
Run Code Online (Sandbox Code Playgroud)

不会编译,但是

MyClass myObject;
myObject << cout;
Run Code Online (Sandbox Code Playgroud)

将是合法的.

要解决这个问题,您可以应用软件工程的基本定理 - 任何问题都可以通过添加另一层间接来解决.而不是将运算符设置为"虚拟",而是考虑向类中添加一个新的虚函数,如下所示:

class MyClass {
public:
    virtual void print(ostream& where) const;
};
Run Code Online (Sandbox Code Playgroud)

然后,将operator <<定义为

ostream& operator<< (ostream& out, const MyClass& mc) {
    mc.print(out);
    return out;
}
Run Code Online (Sandbox Code Playgroud)

这样,运算符<< free function具有正确的参数顺序,但operator <<的行为可以在子类中自定义.

希望这可以帮助!

  • @Kos:不,不.只要你声明它是`unsigned indirection;`,你只需要继续添加越来越多的间接,当你翻身时问题会自行解决 (12认同)
  • *"任何问题都可以通过添加另一层间接来解决"* - 记住,除了间接层太多的问题之外的任何问题;) (5认同)

Mar*_*ork 32

您定义运算符<<以调用虚拟打印方法:

class Base
{
    protected:
        virtual void print(std::ostream& str) const = 0;
    public:
        friend std::ostream& operator<<(std::ostream& str, Base const& data)
        {
            data.print(str);
            return str;
        }
}
Run Code Online (Sandbox Code Playgroud)