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

how to mimic derived to base pointer auto cast?

本文关键字:指针 何模仿 派生      更新时间:2023-10-16

我有一个Base类和一个Derived类。两者都有自己的非静态数据成员,并且都必须具有标准布局。所以我不能从Base继承Derived,必须单独声明。我知道我可以在Derived类中定义一个operator 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);
}

如果使用这种正式解决方案,应仔细分析UB的情况。