C ++无法实例化抽象类子
Posted
技术标签:
【中文标题】C ++无法实例化抽象类子【英文标题】:C++ Cannot instantiate abstaract class's child 【发布时间】:2013-12-06 12:38:46 【问题描述】:我有抽象类 Transaction,它包含几个普通的属性和方法和一个方法 - 行为 - 我把它做成纯虚拟的,所以从 Transaction 继承的类可以自己实现它。
我的交易.h
class Transaction abstract
protected:
...
public:
...
virtual void behavior() = 0;
;
我认为这应该是正确的。我有 Cow 类,我想从 Transaction 继承它。
这就是我尝试的方式
class Cow : public Transaction
public:
Cow(int p, Calendar* cal)
this->priority = p;
this->cal = cal;
void Behavior()
...
do some stuff
...
;
问题是,每当我尝试制作 Cow 类的对象时。要么在 Main.cpp 中,要么在 Cow::Behavior 中(这基本上是我需要能够创建 Cow 对象的代码中的两个位置)我最终会出现以下错误。
error C2259: 'Cow' : cannot instantiate abstract class
这真的让我很困惑,因为我不是在尝试实例化抽象类,而是从它继承的类。我确信这是基本的东西,但我似乎无法自己解决这个问题。
顺便说一句。这就是我尝试创建 Cow 的新实例的方式。
Calendar *calendar = new Calendar();
calendar->push(0, new Cow(1, calendar));
方法 Calendar::Push 接受的地方
void Calendar::push(int t, Transaction *tr)
有什么想法吗?
谢谢!
【问题讨论】:
【参考方案1】:您在基类中声明了一个纯虚函数behavior
,在派生类中声明了一个不相关的函数Behavior
。这不会覆盖纯函数,因为它具有不同的名称。 C++ 区分大小写。
【讨论】:
C++ 也有override
说明符来捕捉这些错别字,然后再将它们变成 SO :-)
谢谢你,迈克。耶稣,我很愚蠢,很抱歉我完全忽略了这一点。【参考方案2】:
C++ 区分大小写。您在基类中使用小写“b”拼写行为,在派生类中使用小写“b”。
【讨论】:
【参考方案3】:由于您没有覆盖 Cow 类中的纯虚函数行为 [行为被视为不同的函数],因此 Cow 也成为了一个抽象类。其余的是 C++ 语义。
【讨论】:
【参考方案4】:首先,C++ 没有关键字abstract。看来您正在使用 C++/CLI。试试下面的定义
ref class Transaction abstract
protected:
...
public:
...
virtual void behavior() = 0;
;
ref class Cow : public Transaction
public:
Cow(int p, Calendar* cal)
this->priority = p;
this->cal = cal;
void behavior() override
...
do some stuff
...
;
【讨论】:
以上是关于C ++无法实例化抽象类子的主要内容,如果未能解决你的问题,请参考以下文章
aSmack 错误:XMPPConnection 是抽象的;无法实例化
无法实例化 ExpandableListAdapter,因为它是抽象的