Есть Базовый класс (BaseObject). Нужно чтобы все его наследники поддерживали r\w операции в поток ( >> \ << ). Можно ли реализовать оператор на базовом классе, или только для каждого конкретного наследника?
Сделал так(код ниже). Работает. Но тогда эта реализация срабатывает и для типов неотнаследованных от BaseObject. что не есть хорошо((.
C++ (Qt)
class BaseObject : public QObject
{
Q_OBJECT
public:
explicit BaseObject(QObject *parent = 0);
virtual ~BaseObject();
QString GetType();
QString GetHash();
virtual void Serialize(QDataStream &stream) const = 0;
virtual void Deserialize(QDataStream &stream) = 0;
};
typedef QSharedPointer<BaseObject> BaseObjectShp;
template<class T>
inline QDataStream& operator <<(QDataStream& out, const QSharedPointer<T>& obj)
{
BaseObject* nullObj = static_cast<T*>(0);
Q_UNUSED(nullObj );
out << obj->GetType();
obj->Serialize(out);
return out;
}
template<class T>
inline QDataStream& operator >>(QDataStream& in, QSharedPointer<T>& obj)
{
BaseObject* nullObj = static_cast<T*>(0);
Q_UNUSED(nullObj );
QString type;
in >> type;
if (obj.isNull())
{
FactoryShp factory = FactoryShp(new Factory);
obj = qSharedPointerCast<T>(factory->Create(type));
}
obj->Deserialize(in);
return in;
}