У меня есть следующая абстрактная фабрика:
#include "MediaDevice.h"
class MediaFactory {
public:
MediaFactory();
virtual ~MediaFactory();
virtual MediaDevice * FMediaDevice (int type) = 0;
};
и следующая фабрика, унаследованная от абстрактной фабрики:
#include "MediaFactory.h"
class JVCMedDevFactory : public MediaFactory {
public:
MediaDevice* FMediaDevice (int type) {
switch ((type_e)type) {
case CDPlayer_e:
return new JVCCdPlayer() ;
case DVDPlayer_e:
return new JVCVcrPlayer() ;
}
}
};
Медиа-устройство:
#include <string>
#include <utility>
using namespace std;
class MediaDevice {
public:
MediaDevice();
virtual ~MediaDevice();
virtual void Start () = 0 ;
virtual void Stop () = 0 ;
virtual void Forward () = 0 ;
virtual void Rewind () = 0 ;
virtual pair <string,string> getName () const = 0;
protected:
pair <string,string> DeviceName;
};
Вот как я определяю игроков JVC:
#include "MediaDevice.h"
#include <iostream>
using namespace std;
class JVCCdPlayer : public MediaDevice {
public:
JVCCdPlayer(){
DeviceName.first = "JVC";
DeviceName.second = "CD";
}
void Start (){
cout << "Playing " << this->getName().first << "," << this->getName().second << endl;
}
void Stop (){
cout << "Stopped " << this->getName().first << "," << this->getName().second <<endl;
}
void Forward (){
cout << "Rewind " << this->getName().first << "," << this->getName().second <<endl;
}
void Rewind (){
cout << "Forward " << this->getName().first << "," <<this->getName().second <<endl;
}
pair <string,string> getName () const{
return DeviceName;
}
~JVCCdPlayer(){}
};
И я получаю следующую ошибку
Тип возврата не идентичен и не ковариантен с типом возврата «MediaDevice *» переопределенной виртуальной функции «MediaFactory :: FMediaDevice»
Важно, что в visula studio у меня есть красная линия под FMediaDevice в объявлении MediaDevice * FMediaDevice (int type) {в классе MedDevFactory. И неважно, что я верну. Я могу вернуть 0 и все равно получить ошибку.
Почему?
JVCCdPlayer
иJVCVcrPlayer
. - person Xeo   schedule 29.05.2011MediaDevice
разрешается к двум различным типам между определениямиMediaFactory
иJVCMedDevFactory
. Используете ли вы форвардные объявления в пространствах имен или что-то, что может вызвать это? - person CB Bailey   schedule 29.05.2011"MediaDevice.h"
- person Nawaz   schedule 29.05.2011