2013-03-19 3 views
3

У меня есть следующий код для унаследованных виртуальных классов и как-то inh::P1 составлен как char. Может кто-нибудь объяснить, почему компилятор выбирает char за int за inh::P1 в этом примере? Благодаря!поиск по виртуальному наследованию

#include <iostream> 

class myClass {public: typedef int P1;}; 
class myClassdef : virtual public myClass {}; 
class myClass2 : virtual public myClass { public: typedef char P1;}; 
class inh : public myClassdef, public myClass2 {}; 

int main() 
{ 
    std::cout << sizeof(inh::P1) << std::endl; 
    return 0; 
} 

ответ

4
sizeof(inh::P1); 

Поиск происходит от самого непосредственного уровня и вверх, следовательно, inh::P1 относится к P1, который наследуется через myClass2, что действительно имеет типа, char. Если вам нужно передать элемент в верхнем использовании базового класса:

sizeof(myClass::P1); 

Обратите внимание, что:

inh::P1   ---> Refers to immediate base member, i.e: myClass2::P1 
myClass2::P1  ---> Refers to member in current class scope, i.e: myClass2::P1 
myClassdef::P1 ---> Refers to immediate base member, i.e: myClass::P1 
myClass::P1  ---> Refers to member in current class scope, i.e: myClass::P1 
1

В основном в несколько наследовании поиск производится на ближайший уровне, из-за которой при вызове вдыхания :: P1, P1 myClass2. Итак, если вы хотите сослаться на myClass, позвоните так явно, как показано ниже:

sizeof(myClass::P1); 
Смежные вопросы