- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下抽象工厂:
#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(){}
};
我得到以下错误
返回类型与重写虚函数“MediaFactory::FMediaDevice”的返回类型“MediaDevice*”不相同也不协变
重要的是,在 visula studio 中,我在 MediaDevice* FMediaDevice (int type) { 类 MedDevFactory 声明中的 FMediaDevice 下有红线。我返回什么并不重要。我可以返回 0,但仍然会收到错误。
为什么?
最佳答案
从错误消息来看,似乎是 JVCCdPlayer
或 JVCVcrPlayer
(或两者)不是来自 MediaDevice
.是这样吗?
您必须从 MediaDevice
派生两者.确保您的定义如下所示:
class JVCCdPlayer : public MediaDevice
{
};
class JVCVcrPlayer : public MediaDevice
{
};
或者层次结构中的某处,MediaDevice
应该存在。
类(class)MediaDevice
有成员(member)资料DeviceName
这是类型 pair<string,string>
,但您没有包含 pair
所在的 header 被定义为。所以包括 <utility>
.同样,请确保您已包含所有必要的 header 。
此外,我不会写 using namespace std
在头文件中。所以我会重写 MediaDevice.h
作为:
#ifndef MEDIA_DEVICE_H
#define MEDIA_DEVICE_H
#include <string>
#include <utility>
class MediaDevice
{
public:
MediaDevice();
virtual ~MediaDevice();
virtual void Start () = 0 ;
virtual void Stop () = 0 ;
virtual void Forward () = 0 ;
virtual void Rewind () = 0 ;
virtual std::pair<std::string,std::string> getName () const = 0;
private:
std::pair<std::string,std::string> DeviceName;
};
#endif
也就是说,我将用 std::
限定每个名称而不是 using namespace std
.
顺便说一句,我没有看到以下纯虚函数的定义:
virtual pair <string,string> getName () const = 0;
你在派生类中定义了吗? (虽然报错并没有说是这个问题,但是还是要确认一下)。
此外,成员(member)数据DeviceName
声明为 private
这需要是 protected
因为您正在从派生类访问它 JVCVcrPlayer
和 JVCCdPlayer
.
关于c++ - 返回类型与重写虚函数 "MediaDevice*"的返回类型 "MediaFactory::FMediaDevice"不相同也不协变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165003/
我有以下抽象工厂: #include "MediaDevice.h" class MediaFactory { public: MediaFactory(); virtual ~Me
我是一名优秀的程序员,十分优秀!