我有一个Base
类和一个Derived
类。两者都有自己的非静态数据成员,并且都必须具有标准布局。因此,我无法从Derived
继承Base
,而不得不分别声明。我知道我可以在operator Base&
类中定义Derived
以便Base& base = derived
起作用。是否有任何方法也可以使Base* pBase = pDerived
正常工作(没有显式强制转换)?
答案 0 :(得分:1)
您可以使用代理对象来表示指针:
struct Base;
struct Derived;
struct Ptr
{
Ptr(void* ptr) : ptr(ptr) { }
operator Base*() { return reinterpret_cast<Base*>(ptr); }
operator Derived*() { return reinterpret_cast<Derived*>(ptr); }
private:
void* ptr;
};
struct Base
{
Ptr operator&() { return Ptr(this); }
operator Derived&() { return *reinterpret_cast<Derived*>(this); }
};
struct Derived
{
Ptr operator&() { return Ptr(this); }
operator Base&() { return *reinterpret_cast<Base*>(this); }
};
void bar(Base*)
{ }
void foo()
{
Derived derived;
Base* base1 = &derived;
Base& base2 = derived;
bar(&derived);
}
如果使用此正式解决方案,则应仔细分析其UB。