まず、質問は 、追加機能を備えた派生クラスへの共有ポインタのダウンキャストに非常に似ています。ここで、良い答えがあります。しかし、これが有効である(または無効である)理由と、共有ポインターを使用しない場合について説明したいと思います。それで :
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オブジェクトで使用できるようにしたい
- 追加機能のため、上記は不可能です。ただし、これらの関数はBaseから実装するのは簡単です。
- また、できるだけ効率的にしたい(変換や間接化を避ける)
したがって、上記のトリックが有効である場合、それは良い解決策になる可能性があります...しかし、おそらくこの問題を解決するためのより良い設計がありますか?