考虑以下模板类。
template <typename X>
class Base
{
public:
void method1() {...}
void method2() {...}
...
private:
int member1;
float member2;
...
};
template <typename X>
class Derived : public Base<X>
{
public:
void m1() {...}
void m2() {...}
// no members here
}
// similar with second set of classes SecBase, SecDerived
Base<SecBase<X>> originalObject;
Derived<SecDerived<X>>& wrapperRef = reinterpret_cast<Derived<SecDerived<X>>&>(originalObject);
这两个类具有完全相同的成员。 Derived
类似于Base
的包装。最后一行中的演员安全吗?如果我们考虑使用优化进行编译会怎样?编译器可以做一些它不会工作的优化吗?
答案 0 :(得分:3)
最后一行的演员阵容安全吗?
如果两个类布局兼容,则转换有效;
看起来第一个条件得到满足;第二个是如果数据成员类型都不依赖于模板参数(或者,如果确实如此,它会解析为SecBase<X>
和SecDerived<X>
的相同类型。)
话虽如此,我不会将其描述为&#34; safe&#34;,因为很容易修改代码并意外地破坏其中一个条件。
如果我们考虑使用优化进行编译会怎样?编译器可以做一些它不会工作的优化吗?
如果它们不是布局兼容的,那么程序有不确定的行为,你不能依赖任何东西。行为可能会根据优化或其他设置或月球的相位而改变。
答案 1 :(得分:1)
您应该为此重新设计解决方案,例如:
template <typename X>
class Derived
{
Base* pB_;
public:
Derived(Base * pB) : pB_(pB) {}
void m1() {pB_->method1()}
void m2() {pB_->method2()}
}