C++ C++;继承与抽象函数实现
我得到了C++ C++;继承与抽象函数实现,c++,inheritance,polymorphism,virtual,abstract,C++,Inheritance,Polymorphism,Virtual,Abstract,我得到了无法实例化抽象类的错误。现在我意识到了这一点,但是我不知道我的代码是如何出错的。所以我来了,请求帮助 我有 Action.h: #ifndef ACTION_H #define ACTION_H // ===== Dependencies ===== // #include ... ... // ===== Classes ===== // class Action { public: Action(); void set(...); virtual v
无法实例化抽象类的错误。现在我意识到了这一点,但是我不知道我的代码是如何出错的。所以我来了,请求帮助
我有
Action.h
:
#ifndef ACTION_H
#define ACTION_H
// ===== Dependencies ===== //
#include ...
...
// ===== Classes ===== //
class Action
{
public:
Action();
void set(...);
virtual void doAction() = 0;
};
#endif
#ifndef MOVE_ACTION_H
#define MOVE_ACTION_H
// ===== Dependencies ===== //
#include ...
...
// ===== Classes ===== //
class MoveAction : public Action
{
public:
MoveAction(...); // Constructor
using Action::set;
void doAction(); // Do action
private:
...
};
#endif
MoveAction.h
:
#ifndef ACTION_H
#define ACTION_H
// ===== Dependencies ===== //
#include ...
...
// ===== Classes ===== //
class Action
{
public:
Action();
void set(...);
virtual void doAction() = 0;
};
#endif
#ifndef MOVE_ACTION_H
#define MOVE_ACTION_H
// ===== Dependencies ===== //
#include ...
...
// ===== Classes ===== //
class MoveAction : public Action
{
public:
MoveAction(...); // Constructor
using Action::set;
void doAction(); // Do action
private:
...
};
#endif
MoveAction.cpp
:
#include "MoveAction.h"
MoveAction::MoveAction(...) : Action() {
...
}
/* Do action */
void MoveAction::doAction() {
...
setTile(...);
}
...
vector<Action> Actor::getActions(...) {
vector<Action> actions = vector<Action>();
actions.push_back(MoveAction(...));
...
return actions;
}
因此本质上我是在继承Action.h
的类MoveAction.h
中实现doAction()
。但是,当我执行以下操作时:
Actor.cpp
:
#include "MoveAction.h"
MoveAction::MoveAction(...) : Action() {
...
}
/* Do action */
void MoveAction::doAction() {
...
setTile(...);
}
...
vector<Action> Actor::getActions(...) {
vector<Action> actions = vector<Action>();
actions.push_back(MoveAction(...));
...
return actions;
}
它工作正常(注意将所有类型更改为MoveAction
),这显然会停止任何扩展性选项
有人有什么想法吗?我觉得我错过了一些非常明显的东西
谢谢 不能有类型为Action
的对象向量,即:
vector<Action>
向量。还记得在处理原始指针时正确处理内存管理。您可以使用某种类型的to指针来缓解内存问题:,或类似的问题。这样,您将引入一点,一点的效率开销,但这是强烈建议,只要你是一个初学者。不要担心这一点,因为这可能是预优化。首先,您需要一个正确的、工作正常的、不会泄漏内存的代码,然后您可以随时在以后进行调整(优化)
C++标准n3337§10.4/1抽象类
抽象类机制支持一般概念的概念,
例如一个形状,其中只有更具体的变体,如圆
和正方形,实际上可以使用。也可以使用抽象类
定义派生类为其提供各种
实现
C++标准n3337§10.4/2
抽象类是一个只能用作
另一类无法创建抽象类的对象
但作为派生自它的类的子对象除外。类是抽象的
如果它至少有一个纯虚函数。[注:此功能
可能被继承:请参见下文。-结束说明]虚拟函数
通过在函数中使用纯说明符(9.2)指定纯
类定义中的声明。(……)
您不能拥有操作类型的对象向量,即:
vector<Action>
向量。还记得在处理原始指针时正确处理内存管理。您可以使用某种类型的to指针来缓解内存问题:,或类似的问题。这样,您将引入一点,一点的效率开销,但这是强烈建议,只要你是一个初学者。不要担心这一点,因为这可能是预优化。首先,您需要一个正确的、工作正常的、不会泄漏内存的代码,然后您可以随时在以后进行调整(优化)
C++标准n3337§10.4/1抽象类
抽象类机制支持一般概念的概念,
例如一个形状,其中只有更具体的变体,如圆
和正方形,实际上可以使用。也可以使用抽象类
定义派生类为其提供各种
实现
C++标准n3337§10.4/2
抽象类是一个只能用作
另一类无法创建抽象类的对象
但作为派生自它的类的子对象除外。类是抽象的
如果它至少有一个纯虚函数。[注:此功能
可能被继承:请参见下文。-结束说明]虚拟函数
通过在函数中使用纯说明符(9.2)指定纯
类定义中的声明。(……)
下面是一个如何使用std::vector
而不是std:vector
的示例:
#包括
#包括
#包括
集体诉讼{
公众:
typedef std::向量ptr;
动作(){}
虚空doAction()=0;
};
集体行动:公共行动{
公众:
MoveAction(){}
void doAction(){std::cout下面是一个如何使用std::vector
而不是std:vector
的示例:
#包括
#包括
#包括
集体诉讼{
公众:
typedef std::向量ptr;
动作(){}
虚空doAction()=0;
};
集体行动:公共行动{
公众:
MoveAction(){}
void doAction(){std::cout您的意思是:存储“Action”而不是“Action*”或者Action
而不是MoveAction
;)@Mr_-Hic-up存储Action而不是Action*将是一个错误,即使它可以被编译!就是这样,肯定错过了这里显而易见的内容。谢谢伙计!@Ubobo我随时为您服务,先生,您的意思是:存储“Action”而不是“Action*”或者Action
而不是MoveAction
;)@Mr_-Hic-up存储Action而不是Action*即使可以编译也会是一个错误啊!就是这样,肯定错过了这里显而易见的内容。谢谢伙计!@Ubobo我随时为您服务,先生