Приведение и использование другого переопределенного метода нового класса в C ++ - PullRequest
1 голос
/ 09 мая 2019

У меня есть два производных класса от абстрактного базового класса.Каждый из производных классов имеет свои отдельные реализации, которые переопределяют виртуальную функцию func () в базовом классе.Я создаю объект производного класса 1 с именем «а» и запускаю из него функцию func ().

Это создает объект производного класса 1 с именем teleporter, адрес памяти которого приводится к объекту производного класса 2, называемому телепортированным.Затем я запускаю func () из teleported, который является объектом производного класса, но это не работает, и он просто выполняет бесконечный рекурсивный цикл с помощью функции Func () в производном классе 1.

На самом деле это упрощениеЯ использую это в коде, в котором производный телепорт производного класса содержит определенные значения (унаследованные от базового класса и разделенные с производными 1 и 2), которые я хочу передать другому производному классу.Это потому, что я хочу получить доступ к функциям других классов с тем же объектом.Я знаю, я мог бы просто создать новый объект и скопировать каждое значение отдельно, но это довольно большая программа, поэтому я бы не стал менять все это, если это возможно.Если возможно получить доступ к переопределенным методам классов типов вместо старых методов.

using namespace std;

class baseClass {
protected:
public:
    virtual void func() = 0;

};

class derivedClass2 : public baseClass {
public:
    void func() override {
        cout << "Derivation 2 running.\n";
    }
};

class derivedClass1 : public baseClass {
public:
    void func() {
        cout << "Derivation 1 running.\n";
        derivedClass1 teleporter;
        derivedClass2* teleported = (derivedClass2*)(&teleporter);
        teleported->func();
    }
};

int main() {
    derivedClass1 a;
    a.func();
    return 0;
}

Результат:

Derivation 1 is running.
Derivation 1 is running.
Derivation 1 is running.
Derivation 1 is running.
....

Желаемый результат:

Derivation 1 is running.
Derivation 2 is running.

Обновление: Как мне сказали, я использовал старое приведение типов C, я пробовал стили приведения C ++.static_cast и const_cast не запускались, dynamic_cast выдавал nullptr, поскольку преобразование было неудачным, а reinterpret_cast давало тот же результат, что и приведения типа C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...