2013-07-29 6 views
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() 
{ 
    CParam *cp = new CUInt32(ANALOG); 

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

Я говорю об ошибке ошибка: нет совпадения для 'operator < <' in 'std :: cout < < * cp' |

Мои вопросы

  1. Можно ли использовать полиморфные указатели базового класса с соиЬ?
  2. Если да, то как мы могли это сделать?

Спасибо за ваше время!

+2

Вместо перегрузки 'operator <<' для 'CUInt32' перегрузить его для' CParam'. – Casey

+0

Не совсем уверен, как я мог это сделать, поскольку второй аргумент inline ostream & operator << (ostream & OutStream, CUInt32 и UInt32Obj) различен для каждого производного класса. – NeonGlow

+1

Также (хотя это и не вызывает проблем здесь), полезно сделать ссылку на const: 'inline ostream & operator << (ostream & OutStream, const CParam & obj)' – biocomp

ответ

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 в базовом классе как виртуальный/реферата обеспечивает он будет доступен для всех подклассов и правильная функция будет вызываться ,

0

Поскольку код перегрузки использует PrintData, вы можете определить функцию на уровне базового класса. Поскольку компилятор не смог найти перегрузки на уровне базового класса, он выдает исключение.

+0

Итак, невозможно ли печатать данные с использованием базового класса ptr? – NeonGlow

+0

Тогда вам, возможно, придется определить виртуальную функцию для этого в базе – Karthikeyan

2

Наряду с очевидной точкой (operator<< следует взять ссылку на константную базу), вы также хотите изменить определение 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); 
} 
+0

Спасибо за предложения – NeonGlow

Смежные вопросы