2

多重継承を持つクラスからデータ メンバーへのポインターを取得する方法があるかどうかを確認しようとしています。それらを明確にして正しいオフセットを取得する方法はありますか?

struct Foo
{
    int BarData;
};

struct FooBarBaseA : public Foo
{
    int DataA;
};

struct FooBarBaseB : public Foo
{
    int DataB;  
};

struct FooBar : public FooBarBaseA, public FooBarBaseB 
{

};

Bar FooBar::* p1 = &FooBar::FooBarNodeA::BarData; // should be 0?
Bar FooBar::* p2 = &FooBar::FooBarNodeB::BarData; // should be 4 or 8?

編集:私はそれらを2つの独立した値にしたいのですが、両方

int FooBar::FooBarBaseA::Foo:: *p1 = &FooBar::FooBarBaseA::Foo::BarData; and 
int FooBar::FooBarBaseB::Foo:: *p2 = &FooBar::FooBarBaseB::Foo::BarData; 

継承ツリーが仮想でない場合、同じ値が得られますが、異なるオフセットであってはなりませんか?

4

1 に答える 1

2

このコードは、あなたが探しているものを示していると思います:

#include <iostream>
#include <typeinfo>

using std::cerr;

struct Foo
{
    int BarData;
};

struct FooBarBaseA : public Foo
{
    int DataA;
};

struct FooBarBaseB : public Foo
{
    int DataB;
};

struct FooBar : public FooBarBaseA, public FooBarBaseB
{

};

int main(int argc,char **argv)
{
  int FooBar::* p1 = static_cast<int FooBarBaseA::*>(&Foo::BarData);
  int FooBar::* p2 = static_cast<int FooBarBaseB::*>(&Foo::BarData);
  FooBar foo;
  foo.FooBarBaseA::BarData = 1;
  foo.FooBarBaseB::BarData = 2;
  cerr << (foo.*p1) << "\n";
  cerr << (foo.*p2) << "\n";
  return 0;
}

出力:

1
2
于 2012-05-06T05:41:58.633 に答える