Я могу понять, почему dynamic_cast работает в этом случае:
#include <iostream>
struct A{
virtual ~A() = default;
};
struct B {
virtual ~B() = default;
};
struct C : A, B{};
void f(const A &a) {
if(auto p = dynamic_cast<const B*>(&a))
std::cout << "a is a B" << std::endl;
}
int main() {
f(C{});
return 0;
}
Но почему, если вы удалите полиморфизм из B, он все равно будет работать:
#include <iostream>
struct A{
virtual ~A() = default;
};
struct B {
};
struct C : A, B{};
void f(const A &a) {
if(auto p = dynamic_cast<const B*>(&a))
std::cout << "a is a B" << std::endl;
}
int main() {
f(C{});
return 0;
}
Это потому, что dynamic_cast должен знать только, что реальный тип объекта, который вы даете, имеет параметр (как это сделал бы dynamic_cast<void*>
/ typeid), и после того, как он знает реальный тип, он знает, является ли тип производным от не полиморфная основа?