У меня есть два производных класса от абстрактного базового класса.Каждый из производных классов имеет свои отдельные реализации, которые переопределяют виртуальную функцию 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.