#include <iostream>
class A
{
public:
A()
{
std::cout << "\n A_Constructor \t" << this <<std::endl;
}
void A_Method()
{
std::cout <<"\n A_Method \t" << this <<std::endl;
}
};
class B:public A
{
public:
B()
{
std::cout <<"\n B_Constructor \n";
}
void B_Method()
{
std::cout <<"\n B_Method \t" << this <<std::endl;
}
};
int main()
{
A *a_obj = new A;
B *b_obj = static_cast<B*> (a_obj); // This isn't safe.
b_obj->B_Method();
getchar();
return 0;
}
OUTPUT:はstatic_cast疑い
A_Constructor 001C4890
B_Method 001C4890
一切実行時のチェックは型変換に関与していないされていないとして、static_cast
は安全ではありません。しかし、この例では、私が期待していなかったものを得ました。 B::B()
への呼び出しがないので、そのメンバーのいずれもb_obj
によって呼び出されるべきではありません。それにもかかわらず、私は出力を得た。
この単純なケースでは、安全ではないとはいえ、私は成功したかもしれません。私の疑問がある -
- 私は
class B
メンバ関数にアクセスすることができたかB::B()
への呼び出しは、ありませんが。 - これは安全ではなく、間違っているかもしれない例を挙げてください(私が前に示したものは悪い例として役立つかもしれませんが、さらに良いものもあります)。
私はVisual Studio 2010で、\ Wallオプションを設定しました。
ヘンリー・スペンサー氏は、「コンパイラに嘘をつければ、復讐を得るだろう」と述べています。あなたのキャストを実行することによってコンパイラはあなたを信じるように強制し、あなたはかなり期待される結果を得ます。 –
cast.cpp:31:12:error: 'B'に 'check'という名前のメンバーがありません –
@Ninefingers - ここで編集中に意味のある名前を付けていました。誰もが容易に追うことができます。しかし、1つを変更するのを忘れました。指摘してくれてありがとう。 – Mahesh