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来允许这种关系。