15

基本クラスとそれを拡張する子クラスがあります。子クラスには、親クラスにはない独自のメソッドがあります。つまり、基本クラスで仮想として宣言することは、実際にはオプションではありません。

class A {
  public:
    virtual void helloWorld();
};

class B : public A {
  public:
    virtual void helloWorld();
    void myNewMethod();
};

次に、私の実装では、A へのポインターがあり、それを B として構築しました。

// somewhere in a .cpp file
A* x;
x = new B();
x->myNewMethod(); // doesn't work

私の現在の解決策は、それをキャストすることです:

((B *)x)->myNewMethod();

私の質問は、これを行うためのよりクリーンな方法はありますか、それとも進むべき道をキャストしていますか?

4

3 に答える 3

18

私の質問は、これを行うためのよりクリーンな方法はありますか、それとも進むべき道をキャストしていますか?

この場合、実行時のキャストは問題ないようです。ただし、C スタイルのキャストではなく、以下を使用する必要があります(実際に の型のオブジェクトを指してdynamic_cast<>いるかどうかわからない場合)。xB

B* pB = dynamic_cast<B*>(x); // This will return nullptr if x does not point
                             // to an object of type B
if (pB != nullptr)
{
    pB->myNewMethod();
}

一方、xがタイプ のオブジェクトを指していることが確実な場合はB、次を使用する必要がありますstatic_cast<>

B* pB = static_cast<B*>(x);
pB->myNewMethod();
于 2013-03-10T18:58:06.230 に答える
1

Aは と呼ばれるメソッドを定義していないため、myNewMethod()呼び出すことができません。

私は通常キャストを強く思いとどまらせますが、ここでは実際にキャストが唯一の方法です。

于 2013-03-10T18:57:14.980 に答える