C++ 无法实例化 abstaract 类的子级

C++ Cannot instantiate abstaract class's child

本文关键字:abstaract 实例化 C++      更新时间:2023-10-16

我有一个抽象类Transaction,它包含两个正常的属性和方法,还有一个方法Behavior,我将其设为纯虚拟的,因此从Transaction继承的类可以自己实现它。

我的交易.h

class Transaction abstract{
protected:
...
public:
...
virtual void behavior() = 0;

};

我认为这应该是正确的。我有一个类Cow,我想从交易中继承它。

这就是我尝试的方式

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

这真的让我很困惑,因为我不是想实例化一个抽象类,而是想实例化从中继承的类。我确信这是基本的东西,但我似乎无法独自解决这个问题。

Btw。这就是我尝试创建Cow的新实例的方式。

    Calendar *calendar = new Calendar();
calendar->push(0, new Cow(1, calendar));

其中方法Calendar::Push接受

void Calendar::push(int t, Transaction *tr)

有什么想法吗?

谢谢!

您在基类中声明了一个纯虚拟函数behavior,在派生类中声明了不相关的函数Behavior。这不会覆盖纯函数,因为它有一个不同的名称。C++区分大小写。

C++区分大小写。您在基类中使用小写字母"b"拼写behavior,在派生类中使用behavior。

由于您没有覆盖类Cow中的纯虚拟函数行为[行为被视为不同的函数],因此Cow也成为了一个抽象类。其余部分是C++语义。

首先,C++没有关键字抽象。您似乎在使用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
        ...
    }
};