如何模仿派生到基本指针的自动投射?

时间:2018-08-12 11:10:23

标签: c++

我有一个Base类和一个Derived类。两者都有自己的非静态数据成员,并且都必须具有标准布局。因此,我无法从Derived继承Base,而不得不分别声明。我知道我可以在operator Base&类中定义Derived以便Base& base = derived起作用。是否有任何方法也可以使Base* pBase = pDerived正常工作(没有显式强制转换)?

1 个答案:

答案 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。