1

baseclassのオブジェクトまたはderivedclass(の派生クラス)のオブジェクトを返す factorymethod があります baseclass。派生クラスには、virtual void foo(int x)引数を 1 つ取るメソッドがあります。baseclassただしvirtual void foo()、引数なしで持っています。

私のコードでは、ファクトリ メソッドは、 class のオブジェクトを明確に指す bar 型のポインターを返しますderivedclass。ただし、これは実行時にのみ認識されるfoo()ため、引数を取らないというコンパイラ エラーが発生します。このポインターを型のポインターにキャストできますderivedclassか?

std::auto_ptr<baseclass> bar  = classfactory::CreateBar(); //returns object of class derivedclass
bar->foo(5);

class baseclass
{
 public:
      virtual void foo();
}

class derivedclass : public baseclass
{
 public:
      virtual void foo(int x);
}
4

3 に答える 3

3

あなたの質問に答えるにstatic_castは、インスタンスが適切なタイプであることが確実にわかっている場合、またはdynamic_castそうでない場合に使用できます。このようなもの:

std::auto_ptr<baseclass> bar = classfactory::CreateBar();

if (derivedclass *der = dynamic_cast<derivedclass*>(bar.get())) {
  der->foo(5);
}

ただし、このようなコードは通常、設計が悪いことを示唆しています。派生クラスの詳細にアクセスする必要はありません。おそらく、基本クラスのインターフェイスは本来あるべきほど完全ではありませんか?

于 2013-10-18T09:45:39.930 に答える
-1

現在、bar 変数はベースクラス型であるため、foo(int x) を実行できません。次のような適切なタイプに変換する必要があります。

std::auto_ptr<baseclass> bar  = classfactory::CreateBar(); //returns object of class derivedclass
std::auto_ptr<derivedclass> bar_derived(dynamic_cast<derivedclass*>(bar.get()) ? (static_cast<derivedclass*>(bar.release())) : 0 );
bar_derived->foo(5);
于 2013-10-18T09:47:28.010 に答える