Я подумал, что смогу очистите это, немного больше абстрагируя каждый узел, чтобы класс 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]