可能这个问题多次提出,但我仍然找不到任何有效的合理答案。考虑以下代码段:
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 ++ 17中,它是第8.2.10节[expr.reinterpret.cast]。使用方括号中的短语获取先前标准的相关部分。