【问题标题】:Pointer to inherited data member in multiple inheritance指向多重继承中继承数据成员的指针
【发布时间】:2012-05-06 04:30:25
【问题描述】:

我正在尝试查看是否有一种方法可以从具有多重继承的类中获取指向数据成员的指针。有没有办法消除它们的歧义并仍然获得正确的偏移量?

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; 

产生相同的值,如果继承树不是虚拟的,它们不应该是不同的偏移量吗?

【问题讨论】:

  • 您可以使用这个小程序看到它们获得不同的偏移量:FooBar x; ptrdiff_t d1 = (char*)&x.FooBarBaseA::BarData - (char*)&x; ptrdiff_t d2 = (char*)&x.FooBarBaseB::BarData - (char*)&x; cout << hex << d1 << " " << hex << d2 << endl; 获取指向成员的指针似乎不起作用 - 我尝试的每个编译器都会出现模棱两可的错误。

标签: c++ inheritance multiple-inheritance diamond-problem


【解决方案1】:

我相信这段代码展示了您正在寻找的内容:

#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

【讨论】:

猜你喜欢
  • 2016-06-24
  • 2012-04-12
  • 2016-02-29
  • 2010-09-08
  • 2016-09-02
  • 2017-12-28
  • 1970-01-01
相关资源
最近更新 更多