3

継承された仮想クラスの次のコードがあり、どういうわけかinh::P1としてコンパイルされcharます。この例でコンパイラがforを選択charする理由を誰か説明してもらえますか? ありがとう!intinh::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

2 に答える 2

4
sizeof(inh::P1);

ルックアップは、最も直接のレベルから上に向かっ行われるため、実際にinh::P1は. 最上位の基本クラスのメンバーを参照する必要がある場合は、次を使用します。P1myClass2char

  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
于 2013-03-19T05:48:43.287 に答える
1

基本的に多重継承では、ルックアップは最も近いレベルで行われます。これにより、inh::P1 を呼び出すと、myClass2 の P1 が呼び出されます。したがって、 myClass を参照する場合は、次のように明示的に呼び出します。

sizeof(myClass::P1);
于 2013-03-19T05:53:31.503 に答える