ベースクラスへのポインター
-
27-09-2019 - |
質問
次のクラスがある場合:
class A
{
...
}
class B
{
...
}
class C : public A, public B
{
...
}
そしてどこかで、私はクラスのポインターを検出します B
私が実際にクラスを指していること C
, 、しかし、関数にはクラスへのポインターが必要です A
, 、クラスへのそのポインターを取得するために私は何ができますか A
?
解決
あなたが持っていることを確実に知っているなら B*
それはを指します C
オブジェクト、あなたはペアを使用できます static_cast
S:
B* bp = new C();
C* cp = static_cast<C*>(bp);
A* ap = static_cast<A*>(cp);
継承階層を横切ってキャストする唯一の方法は、使用することです dynamic_cast
, 、このタイプが多型であることが必要です(つまり、クラスには少なくとも1つの仮想メンバー関数が必要です。 基本クラスのデストラクタはそうあるべきだからです virtual
, これは通常問題ではありません):
B* bp = new C();
A* ap = dynamic_cast<A*>(bp);
dynamic_cast
それが失敗した場合(つまり、 bp
実際にはを指していません C
)、nullを返します。わずかなパフォーマンスコストの欠点があります(static_cast
実行時に効果的に無料です)。
他のヒント
コード
class A
{
};
class B
{
};
class C : public A, public B
{
};
int main() {
C c;
A *a = &c;
}
CはすでにAであるため有効なため、割り当ては有効です。
Cが示されているようにAからCを継承する場合、C*ポインターはA*ポインターに暗黙的に変換可能である必要があります。コンパイラがこの相続関係を認識していないように、クラスCの宣言を含めていない可能性はありますか?または、実際にはあなたの質問で与えられたものとは異なる相続関係があるということですか?一部のコードは、この問題を診断するのに役立ちます。
編集
あなたの質問の更新されたバージョンに基づいてください:
// Converts b to type A*, but only if it is actually
// of type C; otherwise, returns NULL
A* convertBtoAviaC(B* b) {
C* c = dynamic_cast<C*>(b);
return c; // note may be NULL, if b is not a C
}
所属していません StackOverflow