【问题标题】:C++ Cannot instantiate abstaract class's childC ++无法实例化抽象类子
【发布时间】: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)

有什么想法吗?

谢谢!

【问题讨论】:

    标签: c++ inheritance abstract-class


    【解决方案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
        
                ...
        
            }
        };
        

        【讨论】:

          猜你喜欢
          • 2012-09-08
          • 1970-01-01
          • 2015-08-04
          • 1970-01-01
          • 2017-02-05
          • 2015-10-06
          • 1970-01-01
          相关资源
          最近更新 更多