Я не знаю, правильно ли я понимаю вашу проблему, поэтому позвольте мне перефразировать ее своими словами ...
Проблема: Для заданных классов B
и D
определить, является ли D
подклассом B
(или наоборот?)
Решение: использовать шаблон магии! Ладно, серьезно, вам нужно взглянуть на LOKI, отличную библиотеку метапрограммирования шаблонов, созданную легендарным автором C ++ Андреем Александреску.
В частности, скачайте LOKI и включите в него заголовок TypeManip.h
в своем исходном коде, затем используйте шаблон класса SuperSubclass
следующим образом:
if(SuperSubClass<B,D>::value)
{
...
}
Согласно документации, SuperSubClass<B,D>::value
будет истинным, если B
является публичной базой D
, или если B
и D
являются псевдонимами одного типа.
т.е. либо D
является подклассом B
, либо D
совпадает с B
.
Надеюсь, это поможет.
редактирование:
Обратите внимание, что оценка SuperSubClass<B,D>::value
происходит во время компиляции, в отличие от некоторых методов, использующих dynamic_cast
, поэтому за использование этой системы во время выполнения не налагается штраф.