inn*_*sas 40 c++ virtual operator-overloading operators
我需要使用虚拟<<运算符.但是,当我尝试写:
virtual friend ostream & operator<<(ostream& os,const Advertising& add);
我得到编译器错误
错误1错误C2575:'operator <<':只有成员函数和基数可以是虚拟的
如何将此运算符设为虚拟?
tem*_*def 73
这个设置的问题是上面定义的操作符<<是一个自由函数,它不能是虚函数(它没有接收者对象).为了使函数成为虚函数,必须将其定义为某个类的成员,这在这里是有问题的,因为如果将operator <<定义为类的成员,则操作数的顺序将错误:
class MyClass {
public:
    virtual ostream& operator<< (ostream& out) const;
};
意思是
MyClass myObject;
cout << myObject;
不会编译,但是
MyClass myObject;
myObject << cout;
将是合法的.
要解决这个问题,您可以应用软件工程的基本定理 - 任何问题都可以通过添加另一层间接来解决.而不是将运算符设置为"虚拟",而是考虑向类中添加一个新的虚函数,如下所示:
class MyClass {
public:
    virtual void print(ostream& where) const;
};
然后,将operator <<定义为
ostream& operator<< (ostream& out, const MyClass& mc) {
    mc.print(out);
    return out;
}
这样,运算符<< free function具有正确的参数顺序,但operator <<的行为可以在子类中自定义.
希望这可以帮助!
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;
        }
}