使运营商“虚拟?
我需要使用虚拟<<运算符。 但是,当我试图写:
virtual friend ostream & operator<<(ostream& os,const Advertising& add);
我得到编译器错误
错误1错误C2575:'operator <<':只有成员函数和基础可以是虚拟的
我怎么能把这个操作符变成虚拟的?
这个设置的问题在于上面定义的operator <<是一个自由函数,它不能是虚拟的(它没有接收者对象)。 为了使函数成为虚拟的,它必须被定义为某个类的成员,这在这里是有问题的,因为如果你定义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; };
然后,将运算符<<定义为
ostream& operator<< (ostream& out, const MyClass& mc) { mc.print(out); return out; }
这样,运算符<<自由函数具有正确的参数顺序,但运算符<<的行为可以在子类中定制。
希望这可以帮助!
您定义您的操作符<<以调用虚拟打印方法:
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; } }
它看起来像你真的想为类的层次结构提供输出function,如果是这样,你可以提供一个friend operator <<
,它调用一个virtual
函数。
class Parent { public: friend std::ostream& operator<< (std::ostream& os, const Parent& p); // ... other class stuff protected: virtual void printMyself(std::ostream& os) const { // do something if you must, or make this a pure virtual } }; std::ostream& operator<< (std::ostream& os, const Parent& p) { p.printMyself(os); return os; } class Child : public Parent { // other class stuff... protected: virtual void printMyself(std::ostream os) const { // whatever you need to do } };
在C ++ FAQ中也有详细介绍
我使用的技术在function上与其他人已经提到的相同,除了我使虚拟“打印”函数成为>>
操作符的成员函数重载之外:
class my_class { protected: virtual std::ostream& operator>>(std::ostream& os_) const { // print *this to `os_` return os_; } public: friend inline std::ostream& operator<<(std::ostream& os, const my_class& mc) { return (mc >> os); } };
这是来自我的一个开源项目的实用程序模板背后的想法。 请参阅: https : //libnstdcxx.googlecode.com/svn/trunk/doc/html/classnstd_1_1basic__printable.html