如何模仿派生到基本指针自动投射?
how to mimic derived to base pointer auto cast?
我有一个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的情况。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 在C++中释放内存期间,迭代器与指针有何不同
- 如何模仿派生到基本指针自动投射?
- 指向成员函数的指针与指向数据成员的指针有何不同
- 对齐方式与指针中尾随零的数量有何关系
- C++03 12.4/12对通过指针显式调用基类析构函数有何说明
- 为什么以及在何处在C++中使用引用和指针
- 如果 x 是一个指针,&x 与 x 有何不同?
- Fortran 中的指针与 C/C++ 指针究竟有何不同