C++抽象类运算符重载和接口执行问题

Ste*_* S. 23 c++

(从原始帖子编辑,将"BaseMessage"更改为"const BaseMessage&")

大家好,我是C++的新手,所以我希望大家可以帮助我"看看我的方式的错误".

我有一个消息层次结构,我正在尝试使用抽象基类来强制执行接口.特别是,我想强制每个派生的消息提供一个重载的<<运算符.

当我尝试这样做时:

class BaseMessage
{
public:

// some non-pure virtual function declarations
// some pure virtual function declarations

virtual ostream& operator<<(ostream& stream, const BaseMessage& objectArg) = 0;

}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨说

"错误:无法将参数'objectArg'声明为抽象类型'BaseMessage'

我相信这里也涉及"朋友"问题,但当我试图将其声明为:

virtual friend ostream& operator<<(ostream& stream, const BaseMessage objectArg) = 0;

编译器添加了一个附加错误

"错误:虚拟功能不能成为朋友"

有没有办法确保我的所有派生(消息)类提供"<<"ostream运算符?

非常感谢,

史蒂夫

Nik*_*sov 40

对此的通用约定是friend在基本级别具有输出操作符并使其调用私有虚函数:

class Base
{
public:

    /// don't forget this
    virtual ~Base();

    /// std stream interface
    friend std::ostream& operator<<( std::ostream& out, const Base& b )
    {
        b.Print( out );
        return out;
    }

private:

    /// derivation interface
    virtual void Print( std::ostream& ) const =0;
};
Run Code Online (Sandbox Code Playgroud)