В этом ответе появился следующий сценарий:
#include <cassert>
struct A {};
struct B { virtual ~B(){} };
struct AA{};
template <class T>
struct C : A, T {};
int main()
{
B * b = new C<B>;
AA * aa = new C<AA>;
assert(dynamic_cast<A*>(b));
assert(dynamic_cast<A*>(aa)); //this line doesn't compile, as expected
}
В g++ 4.8.4 (Ubuntu) это компилируется и утверждение переходит. Мой вопрос в том, что это действительно законно? Я чувствую, что вы не должны иметь возможность dynamic_cast
для не-полиморфного класса вообще, но я свободно признаю, что я не эксперт в том, что происходит здесь.
Когда я пробовал в противоположном направлении:
dynamic_cast<B*>((A*)(new C<B>));
он не компилируется, заявив, что "тип источника не является полиморфным". Я чувствую, что это ключ, но все же кажется, что найти неполиморфный базовый класс, принадлежащий классу, который является текущим указателем (это предложение имело смысл?).