使运营商“虚拟?

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

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