0
class A{};

class B : A{};

void func(A* p)
{

      B* p2 = p; // Error

}
4

3 に答える 3

4

あなたのコードにはいくつかの奇妙な点があります。

  1. プライベート継承を使用します。プライベート継承では、クラススコープ自体の内部にいない場合は、派生クラスに変換できません。
  2. パブリックに継承する場合でも、を使用するには、基本クラスに少なくとも1つの仮想関数(およびそれがデストラクタである必要があります)が必要ですdynamic_cast
  3. 多くのダウンキャストが必要なときに、何か間違ったことをしている可能性があります。おそらく、提供されているAPIの設計または使用法を再考する必要があります。

通常、次のようになります。

class A { 
public:
  virtual ~A() {}
};


class Derived : public A {

};

void func(A* a) {
  if(Derived* d = dynamic_cast<Derived*>(a)) {
    // yeah, a is of type derived
  } else {
    // a is not of type Derived 
  }
}
于 2012-08-14T14:57:29.517 に答える
1
于 2012-08-14T14:53:01.607 に答える
-1

クラスの場合、デフォルトでプライベート継承が使用されます。

于 2012-08-14T14:46:16.723 に答える