C++ 如何模拟派生到基指针的自动转换?

C++ 如何模拟派生到基指针的自动转换?,c++,C++,我有一个Base类和一个Derived类。两者都有自己的非静态数据成员,并且都必须具有标准布局。因此,我不能从Base继承派生的,而必须单独声明。我知道我可以在Derived类中定义一个操作符Base&,这样Base&Base=Derived就可以工作了。有没有办法使Base*pBase=pDerived也能工作(没有显式转换)?您可以使用代理对象来表示指针: struct Base; struct Derived; struct Ptr { Ptr(void* ptr) : ptr(

我有一个
Base
类和一个
Derived
类。两者都有自己的非静态数据成员,并且都必须具有标准布局。因此,我不能从
Base
继承
派生的
,而必须单独声明。我知道我可以在
Derived
类中定义一个
操作符Base&
,这样
Base&Base=Derived
就可以工作了。有没有办法使
Base*pBase=pDerived
也能工作(没有显式转换)?

您可以使用代理对象来表示指针:

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);
}
struct-Base;
结构派生;
结构Ptr
{
Ptr(void*Ptr):Ptr(Ptr){}
运算符基*(){return reinterpret_cast(ptr);}
运算符派生的*(){return reinterpret_cast(ptr);}
私人:
无效*ptr;
};
结构基
{
Ptr运算符&({返回Ptr(this);}
运算符派生的(&(){return*重新解释_cast(this);}
};
结构派生
{
Ptr运算符&({返回Ptr(this);}
运算符基(&({return*reinterpret_cast(this);}
};
空心钢筋(基础*)
{ }
void foo()
{
派生的;
Base*base1=&派生的;
Base&base2=派生的;
条形图(&导出);
}

如果使用此正式解决方案,应仔细分析UB。

我想您可以在
派生的
中重写
运算符&
,并使其返回
Base*
@TFM抱歉,这是个糟糕的示例。我编辑了这个问题。好的,我现在明白了。老实说,我认为这是办不到的。您可能需要一个类外
运算符=
或类外转换运算符,但这两个运算符都不存在。@Empiricist派生类不能有非静态数据成员。您不能隐式转换不相关的指针。因此,您需要调整所有代码。
&
运算符不是我唯一关心的。我改变这个例子来阐述我的意图。也许我不明白你想要什么。我省略了
操作符库&()
,因为您在问题中提到了它。我编辑了我的答案,使之明确。我想这是不可能做到的。我想要的是,我可以在任何需要
Base*
指针的地方提供
Derived*
指针,就像
Derived
是从
Base
公共继承的一样。如果你有
void bar(Base*)
你可以像
bar(&Derived)
那样调用它。再次编辑了我的答案。@J.Doe我想您可以确保“anywhere”始终是一个模板,并在模板类型参数上利用SFINAE on traits来允许这种关系。