首先,这个问题与将共享指针向下转换为具有附加功能的派生类非常相似 ,那里有很好的答案。但是我想解释一下为什么这是有效的(或无效的)以及何时不使用共享指针。所以 :
class Base { /* ... */ };
class Derived : public Base
{
public:
void additionnalFunc(int i){ /* access Base members */ }
};
int main(){
Base b;
Derived* d = (Derived*) &b; // or static_cast ?
d->additionnalFunc(3); // works ok.
}
这与 gcc 的预期一样。所以我的问题是它安全/有效吗?使用任何编译器或架构?如果不是,为什么?
为了解释为什么这个问题,这里是上下文。
- 我有“基础”对象。
- 我无法修改基类
- 我有一组模板化的函数,它们需要与 Base 相同的接口,除了一些额外的函数。
- 我希望能够将此模板库与我的 Base 对象一起使用
- 由于附加功能,以上是不可能的。但是从 Base 实现这些功能是微不足道的。
- 我也想尽可能高效(避免转换和间接)
因此,如果上述技巧有效,它可能是一个很好的解决方案......但也许有更好的设计来解决这个问题?