При попытке вызова метода класса-наследника появляется ошибка - метод не найден в базовом классе (через указатель на базовый класс)

Есть базовый класс "Си-строка":

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 шт):

Автор решения: dIm0n

Надо добавить абстрактный метод в базовый класс (или дать ему какую-то дефолтную реализацию) либо использовать dynamic_cast.

Доки:

https://en.cppreference.com/w/cpp/language/abstract_class

https://en.cppreference.com/w/cpp/language/dynamic_cast

→ Ссылка
Автор решения: Egorithm
class Base
{
public:
   virtual void method() { }
};

class Derived : public Base
{
public:
   void method() override { }
};
→ Ссылка