абстрактный класс и виртуальные функции - PullRequest
0 голосов
/ 20 марта 2020

Будет ли этот класс считаться абстрактным классом, потому что он имеет одну виртуальную функцию? Я все еще был в состоянии создать объект Animal и вызвать getFoodCost ();

Я думал, что абстрактные классы не могут быть созданы. Значит ли это, что объекты могут иметь виртуальные функции и не считаться абстрактным классом?

class Animal
{
public:
    Animal();
    int getBabies();
    double getFoodCost();
    virtual double getPayOff();
    int getQty();

    void incAge();
    void setAge(int);

protected:
    int counter=0;
    int age;
    int cost;   
};

Ответы [ 2 ]

4 голосов
/ 20 марта 2020

Будет ли этот класс считаться абстрактным классом, потому что он имеет одну виртуальную функцию? Я все еще был в состоянии создать объект Animal и вызвать getFoodCost ();

Нет. В C ++ «абстрактный класс» обычно относится к классу с чистой виртуальной функцией :

class Abstract {
public:
    virtual void PureVirtual() = 0; // no implementation
};

class NotAbstract {
    virtual void NotPureVirutal() {
        // Some implementation
    }
};

Я думал, что абстрактные классы не могут быть созданы.

Да, это правильно. Это потому, что абстрактные классы имеют функции без обязательной реализации. У него нет способа создать экземпляр экземпляра напрямую. Он использует наследование и указатели / ссылки для ссылки на абстрактный класс.

Означает ли это, что объекты могут иметь виртуальные функции и не считаться абстрактным классом?

Да. Опять же, абстрактные классы - это классы, которые имеют чисто виртуальные функции. Это отличается от обычной виртуальной функции. Как обсуждалось выше, чисто виртуальные функции не имеют требуемой реализации. С другой стороны, обычные виртуальные функции должны иметь связанную с ними реализацию, чтобы их можно было создавать.

3 голосов
/ 20 марта 2020

Абстрактная функция - это virtual функция-член, для которой вы делаете = 0, как в

virtual double getPayOff() = 0;

Класс с хотя бы одной абстрактной функцией, включая унаследованные, является абстрактным классом. Класс с только чисто виртуальными функциями - это так называемый pure абстрактный класс (также известный как interface class).

Поскольку ваш getPayOff функция не является чисто виртуальной, ваш класс также не является абстрактным.

...