Пожалуйста, помогите мне разобраться, почему я получаю ошибку?

#c #c 11 #visual-c

Вопрос:

Я не могу понять, почему Derived класс остается абстрактным после переопределения функции fun() .

Вот сообщение об ошибке:

 error: invalid new-expression of abstract class type 'Derived' Base *t = new Derived(a);
error: no matching function for call to 'Base::fun(intamp;)'int i = t->fun(b);
 
 #include <iostream>
using namespace std;

class Base
{
protected:
    int s;

public:
    Base(int i = 0) : s(i) {}
    virtual ~Base() {}
    virtual int fun() = 0;
};

class Derived: public Base
{
public:
    Derived(int i) : Base(i) {}
    ~Derived() { cout << --s << " "; }
    int fun(int x) { return s * x; }
};

class Wrapper
{
public:
    void fun(int a, int b)
    {
        Base *t = new Derived(a);
        int i = t->fun(b);
        cout << i << " ";
        delete t;
    }
};

int main()
{
    int i, j;
    cin >> i >> j;
    Wrapper w;
    w.fun(i, j);
    return 0;
}
 

Ответ №1:

Функция имеет две разные сигнатуры между базовым классом и производным классом

 virtual int fun() = 0;
 

но тогда производный класс

 int fun(int x) { return s * x; }
 

если бы вы добавили override , это предупредило бы вас об этой ошибке

 int fun(int x) override { return s * x; }
 

Комментарии:

1. Спасибо, сэр 🙂

Ответ №2:

Проблема в том, что

 int fun(int x) { return s * x; }
 

не переопределяет

 virtual int fun() = 0;
 

потому что список аргументов отличается (нет аргументов против одного int ). Если бы вы написали

 int fun(int x) override { return s * x; }
 

как и следовало ожидать с C 11, компилятор выдал бы вам ошибку по этому поводу.

Комментарии:

1. Спасибо, сэр 🙂