Здравствуйте, IROV.., Вы писали:
IRO>boost::is_virtual_base_of
IRO>по какому принципу это работает?
Ну вот можно открыть исходники буста и увидеть в них такие строки:
template<typename Base, typename Derived>
struct is_virtual_base_of_impl<Base, Derived, mpl::true_>
{
struct boost_type_traits_internal_struct_X : public Derived, virtual Base
{
boost_type_traits_internal_struct_X();
boost_type_traits_internal_struct_X(const boost_type_traits_internal_struct_X&);
boost_type_traits_internal_struct_X& operator=(const boost_type_traits_internal_struct_X&);
~boost_type_traits_internal_struct_X()throw();
};
struct boost_type_traits_internal_struct_Y : public Derived
{
boost_type_traits_internal_struct_Y();
boost_type_traits_internal_struct_Y(const boost_type_traits_internal_struct_Y&);
boost_type_traits_internal_struct_Y& operator=(const boost_type_traits_internal_struct_Y&);
~boost_type_traits_internal_struct_Y()throw();
};
BOOST_STATIC_CONSTANT(bool, value = (sizeof(boost_type_traits_internal_struct_X)==sizeof(boost_type_traits_internal_struct_Y)));
};
В них объявляются две структуры, одна наследует от класса-потомка и виртуально наследует от класса-предка, вторая просто наследует от класса-потомка.
Если класс-потомок действительно виртуально наследует от класса-предка, то размеры этих структур будут совпадать. То, что мы в первом случае еще раз виртуально унаследовали от класса-предка не повлияет на размер структуры.
Если класс-потомок наследует от класса-предка не виртуально, то размер первой структуры будет больше, как минимум на величину указателя (на виртуальный базовый класс).
Если класс-потомок вообще не наследует от класса-предка, то размер первой структуры также будет больше, как минимум на величину указателя (на виртуальный базовый класс) плюс на величину класса-предка.
Как-то так.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.