Полиморфизм среды выполнения C++, вызывающий неожиданное переопределение при наследовании нескольких классовC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Полиморфизм среды выполнения C++, вызывающий неожиданное переопределение при наследовании нескольких классов

Сообщение Anonymous »

Я пытаюсь создать систему с графическим интерфейсом на C++11, в которой, возможно, как и в Godot, каждый «узел» имеет очень конкретную цель, например группировку других узлов, рисование прямоугольника или определение того, когда определенная область экрана прижимается. Некоторые части кода становятся немного повторяющимися, поскольку операторы переключения будут определять тип узла и соответствующим образом приводить его только для того, чтобы в каждом случае вызывать одно и то же имя функции.
Я подумал, что смогу очистите это, немного больше абстрагируя каждый узел, чтобы класс Rectangle наследовал не только класс BaseNode, но и класс Visibility, чтобы указать, что он имеет Draw() функция для вызова. Сделав Visibility::Draw() виртуальной функцией и переопределив ее в каждом производном классе, я смогу заменить длинный оператор переключения одной строкой, которая преобразует BaseNode* в Visibility* и вызовите Draw() для отображения прямоугольника, круга, изображения, многоугольника или любой другой конкретной функции, на которую запрограммирован отдельный узел.
Я написал это теоретически хорошее решение, но обнаружил, что оно не вызывает ни Rectangle::Draw(), ни Visibility::Draw(), а вместо этого вызывает некоторую случайную часть памяти!
В конце концов я выявил проблему и написал небольшую демонстрацию, чтобы воспроизвести ее. Приведение pRect к Visibility* и вызов функции Draw() приведет к выполнению Rectangle::BasicFunc(), унаследованного от BaseNode, вместо Rectangle::Draw () унаследовано от Visibility.

Код: Выделить всё

#include 

class BaseNode {
public:
virtual void BasicFunc() {
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78351320/c-runtime-polymorphism-calling-unexpected-override-when-multiple-classes-are-i[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»