重新解释为空子类的广播

问题描述 投票:0回答:1

可能这个问题多次提出,但我仍然找不到任何有效的合理答案。考虑以下代码段:

struct A {virtual int vfunc() = 0;};
struct B {virtual ~B() {}};
struct C {void *cdata;};
//...
struct Z{};

struct Parent:
  public A,
  virtual B,
  private C,
  //...
  protected Z
{
  int data;
  virtual ~Parent(){}
  virtual int vfunc() {return 0;} // implements A::vfunc interface
  virtual void pvfunc() {};
  double func() {return 0.0;}
  //...etc
};

struct Child:
  public Parent
{
  virtual ~Child(){}
  int more_data;
  virtual int vfunc() {return 0;} // reimplements A::vfunc interface
  virtual void pvfunc() {};// implements Parent::pvfunc interface
};

template<class T>
struct Wrapper: public T 
{
 // do nothing, just empty
};

int main()
{
  Child ch;
  Wrapper<Child> &wr = reinterpret_cast<Wrapper<Child>&/**/>(ch);
  wr.data = 100;
  wr.more_data = 200;
  wr.vfunc();
  //some more usage of wr...
  Parent pr = wr;

  pr.data == wr.data; // true?
  //...

  return 0;
}

基本上,这显示了对虚拟子项class Wrapper的引用以及其祖先类成员的用法。

问题是:该代码是否符合标准?如果不是,那么它到底违反了什么?

c++ inheritance language-lawyer std reinterpret-cast
1个回答
0
投票

我当然希望这是您作为学术活动正在做的事情。请不要编写任何与此相似的真实代码。我不可能指出这段代码的所有问题,因为这里几乎所有内容都有问题。

但是,要回答真正的问题-这是完全未定义的行为。在C ++ 17中,它是第8.2.10节[expr.reinterpret.cast]。使用方括号中的短语获取先前标准的相关部分。

© www.soinside.com 2019 - 2024. All rights reserved.