9

-編集-

迅速な対応のおかげで、コードに非常に奇妙な問題が発生し、キャストをdynamic_castに変更して、完全に機能するようになりました。

-元の投稿-

ある基本クラスのポインタを別の基本クラスにキャストしても安全ですか?これを少し拡張するために、次のコードでマークしたポインターは未定義の動作を引き起こしませんか?

class Base1
{
public:
   // Functions Here
};


class Base2
{
public:
   // Some other Functions here
};

class Derived: public Base1, public Base2
{
public:
  // Functions
};

int main()
{
  Base1* pointer1 = new Derived();
  Base2* pointer2 = (Base2*)pointer1; // Will using this pointer result in any undefined behavior?
  return 1;
}
4

2 に答える 2

13

このポインタを使用すると、未定義の動作が発生しますか?

はい。Cスタイルのキャストは、次のキャストのみを試行します。

  • const_cast
  • static_cast
  • static_cast、 それからconst_cast
  • reinterpret_cast
  • reinterpret_cast、 それからconst_cast

reinterpret_castそれは間違ったことを使用して実行します。

が多形である場合Base2、つまりvirtual関数がある場合、ここでの正しいキャストはですdynamic_cast

Base2* pointer2 = dynamic_cast<Base2*>(pointer1);

仮想関数がない場合、このキャストを直接行うことはできず、Derived最初にキャストする必要があります。

Base2* pointer2 = static_cast<Derived*>(pointer1);
于 2012-07-16T16:32:57.753 に答える
1

dynamic_cast演算子を使用する必要があります。タイプに互換性がない場合、この関数はnullを返します。

于 2012-07-16T16:33:29.867 に答える