(从原始帖子编辑,将"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)
| 归档时间: |
|
| 查看次数: |
9714 次 |
| 最近记录: |