アプリ版:「スタンプのみでお礼する」機能のリリースについて

dynamic_castの必要性がいまいち良く分かりません。
必ずしも必要ないのかも、とも思います。
例えば以下のような場合。
class B
{
public:
virtual void f(){cout << "bbb" << endl;}
};

class D : public B
{
public:
void f(){cout << "aaa" << endl;}
};

int main()
{
B b, *bp;
D d, *dp;

bp = &d;
bp->f();

dp = dynamic_cast<D *>(bp); //(1)
//dp = &d; //(2)
dp->f();

return 0;
}
(1)と(2)はどちらでも同じ意味だと思います。
(2)でいいのなら、(1)のダイナミックキャストをわざわざ用意する必要はないと思います。
どなたかダイナミックキャストの必要性を教えていただけないでしょうか。

A 回答 (1件)

(2)の部分は


dp = &d;
では、dynamic_cast との比較になっていませんが、
dp = (D*)bp;
の間違いですかね?
別の型を経由しないとキャストの意味はないですし。

そうだという前提で話を進めますが、さらに、
class E : public B
{
public:
void f(){count<< "ccc" << endl;}
void g(){cout << "ddd" << endl;}
};
といった感じで別の派生クラスがあったとします。
このとき、

E e; B *bp = &e;
E *ep = (E*)bp; ep->g();

というコードは動作しますが、

D d; B *bp = &d;
E *ep = (E*)bp; ep->g();

は、epが指す先がクラスEではないので、コンパイルは出来ますがまともに動作しません。

dynamic_cast は正しくキャスト可能かどうかチェックできますから、
bpが
> E e; B *bp = &e;
> D d; B *bp = &d;
のどちらの場合でも

E *ep = dynamic_cast<E *>(bp); if (ep != NULL) {ep->g();}

というコードは問題なく動作します。

このように、派生したクラスを派生元クラスのポインタで管理しているときにはクラスチェックとして dynamic_cast が使えます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!