При попытке вызова метода класса-наследника появляется ошибка - метод не найден в базовом классе (через указатель на базовый класс)
Есть базовый класс "Си-строка":
class C_STRING
{
protected:
char * array;
int length;
public:
...
};
От него унаследован класс "Битовая строка" (нули и единицы в качестве char-символов), в котором определён метод смены знака в числе:
class STR_BIT : public C_STRING
{
public:
...
void ChangeSign ();
};
В .cpp-файле метод определён как:
void STR_BIT :: ChangeSign () {...}
По заданию нужно выделить массив указателей на базовый класс и заполнить его как объектами базового класса, так и производного. Массив указателей из C_STRING * элементов, выделяю память через new STR_BIT или new C_STRING. Объекты вроде как создаются без ошибок. При обращении к методу ChangeSign () через указатель на базовый класс компилятор выдаёт ошибку:
error: 'class C_STRING' has no member named 'ChangeSign'
Почему метод не найден в производном классе, что его приходится искать в базовом? Как решить проблему?
Ответы (2 шт):
Надо добавить абстрактный метод в базовый класс (или дать ему какую-то дефолтную реализацию) либо использовать dynamic_cast.
Доки:
class Base
{
public:
virtual void method() { }
};
class Derived : public Base
{
public:
void method() override { }
};