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,因为它是抽象的

mypy 错误:向抽象方法添加类型时无法使用抽象属性实例化抽象类

错误 C2259:“类”:无法实例化抽象类

Jackson JSON 库:如何实例化包含抽象字段的类