c++ - 使用多态性重载 << 运算符

标签 c++ pointers polymorphism

我在 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. 如果是,我们如何做到这一点?

感谢您的宝贵时间!

最佳答案

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

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 定义为虚拟/抽象可确保它可用于所有子类并调用正确的函数。

关于c++ - 使用多态性重载 << 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17917345/

相关文章:

c++ - 函数不参与继承中的重载决策

c++ - C++ 中的多态性和类抽象示例

c++ - 从 Fortran 调用 C++(链接问题?)

c++ - 比较 unsigned char 和 signed char

c - 我如何理解该程序的输出?

C:指针题

pointers - 如何将数据库行扫描为指向结构的指针?

typescript - 处理 typescript 中的内联多态性

c++ - #include <cmath> 与 C++ 程序中的 #include <math.h>

c++ - 意外地 'instantiate' 使用大括号初始化器的抽象类类型?