#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. Спасибо, сэр 🙂