У меня есть следующая иерархия классов:
class A {
virtual void blah() = 0;
};
class B {
virtual void gah() = 0;
};
class C: public A, public B {};
class D: public C {
gah() {}
blah() {}
};
Если я сделаю следующее:
A *something = new D();
auto a = dynamic_cast<B *>(something);
if(a == nullptr) std::cout << "NULL" << std::endl;
Он печатает «NULL» в контексте программы, которую я запускаю (я упростил код, чтобы его было легко прочитать). Это говорит о том, что динамическое приведение не удалось.
Но если я сделаю:
A *something = new D();
auto a = dynamic_cast<C *>(something);
auto b = dynamic_cast<B *>(a);
if(a == nullptr) std::cout << "NULL" << std::endl;
Он не будет печатать «NULL», и dynamic_cast завершится успешно. Есть идеи, почему это так? Я подумал о встраивании, но убедился, что у каждого класса есть виртуальный деструктор, и сгенерировал объектный файл.
Также прошу прощения за любые небольшие синтаксические ошибки, идея должна быть ясной.