can virtual inheritance be detected at compile time?
От: IROV..  
Дата: 26.04.15 21:23
Оценка: -1
http://stackoverflow.com/questions/2893791/c-can-virtual-inheritance-be-detected-at-compile-time

boost::is_virtual_base_of

по какому принципу это работает?
я не волшебник, я только учусь!
Re: can virtual inheritance be detected at compile time?
От: VTT http://vtt.to
Дата: 26.04.15 22:10
Оценка: 6 (2) +1
Здравствуйте, 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)));
};

В них объявляются две структуры, одна наследует от класса-потомка и виртуально наследует от класса-предка, вторая просто наследует от класса-потомка.
Если класс-потомок действительно виртуально наследует от класса-предка, то размеры этих структур будут совпадать. То, что мы в первом случае еще раз виртуально унаследовали от класса-предка не повлияет на размер структуры.
Если класс-потомок наследует от класса-предка не виртуально, то размер первой структуры будет больше, как минимум на величину указателя (на виртуальный базовый класс).
Если класс-потомок вообще не наследует от класса-предка, то размер первой структуры также будет больше, как минимум на величину указателя (на виртуальный базовый класс) плюс на величину класса-предка.
Как-то так.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.