0

我在 SO 上阅读了一些类似的问题和答案,但并不真正理解那里的答案。我很抱歉,如果这是重复的。

有一个这样的基类。

class CParam
{
    public:
        virtual void PrintData(ostream &OutStream) = 0;
};

现在我继承了这个:

class CUInt32:public CParam
{
    public:
          void PrintData(ostream &OutStream);
}

void CUInt32::PrintData(ostream &OutStream)
{
    // Write some data to OutStream Here
}

我为 CUInt32 类重载运算符 <<

inline ostream   &operator<<(ostream &OutStream, CUInt32 &UInt32Obj)
{
    UInt32Obj.PrintData(OutStream);
    return (OutStream);
}

在 int main() 函数中,我执行以下操作:

int main()
{
    CParam *cp = new CUInt32(ANALOG);

    cout << *cp;// Error
    return 0;
}

我收到一个错误提示 错误:'std::cout << *cp'| 中的 'operator<<' 不匹配

我的问题是

  1. 是否可以将多态基类指针与 cout 一起使用?
  2. 如果是,我们怎么能做到这一点?

谢谢你的时间!

4

3 回答 3

3

未为基类定义运算符。简单地改变这个:

inline ostream   &operator<<(ostream &OutStream, CUInt32 &UInt32Obj)
{
    UInt32Obj.PrintData(OutStream);
    return (OutStream);
}

对此:

inline ostream   &operator<<(ostream &OutStream, CParam& cParam)
{
    cParam.PrintData(OutStream);
    return (OutStream);
}

基本上,将PrintData基类中的 定义为 virtual/abstract 可确保它可用于所有子类,并且将调用正确的函数。

于 2013-07-29T06:40:13.477 回答
3

除了明显的一点(operator<<应该引用一个 const 基),您还想更改您的定义PrintData以使其成为const成员函数,以便可以在const对象上调用它。生成的代码最终是这样的:

struct CParam {
    virtual void PrintData(ostream &OutStream) const = 0;
};

struct CUInt32 : CParam {
    void PrintData(ostream &OutStream) const {}
};

ostream &operator<<(ostream &OutStream, CParam const &UInt32Obj) {
    UInt32Obj.PrintData(OutStream);
    return (OutStream);
}
于 2013-07-29T06:47:31.823 回答
0

由于重载代码使用 PrintData,您可以在基类级别本身定义函数。由于编译器在基类级别找不到任何重载,因此会引发异常。

于 2013-07-29T06:35:18.963 回答