0

だから私はキャストに頭を包み込もうとしてきました。他の言語では、次のようなコードを見てきました

Player player = (DifferentObject as Player)

特に、たとえばマルチプレイヤーに関しては。私の質問は、この種のコードを C++ で複製するにはどうすればよいですか? 私が使用する場合

A* a = new B();

B 関数を呼び出したいときはいつでも a をキャストする必要があります。

struct A
{
    A() { }
    virtual ~A() { }

    void a_only_func() const
    {
        std::cout << "a only func." << std::endl;
    }

    virtual void a_virtual_func() const
    {
        std::cout << "a virtual func." << std::endl;
    }
};

struct B : public A
{
    B() { }
    ~B() { }

    void b_only_func() const
    {
        std::cout << "Hello." << std::endl;
    }

    void a_virtual_func() const
    {
        std::cout << "derived." << std::endl;
    }
};

int main()
{
    A* a = new B()
    ((B*)a)->b_only_func();              /* identical - prints Hello.
    (static_cast<B*>(a))->b_only_func();  * identical */
    a->a_only_func();                    // prints a only func.
    a->a_virtual_func();                 // prints derived.
    ((B*)a)->a_virtual_func();           // prints derived
    delete a;
    return 0;
}

ご覧のとおり、すべてが期待どおりに機能します。しかし、明示的なキャストがないわけではありません。ここで微妙なものが欠けていますか?

アップデート

以下は、私が探していたイディオムを表しているようです。

void do_stuff(Player* player)
{
    DerivedPlayer localVar = dynamic_cast<DerivedPlayer*>(player);
}
4

3 に答える 3

2

各クラスがメソッドの独自の実装を提供する必要がある動作が必要な場合は、それらの関数を基本クラスに配置し、としてマークする必要がありますvirtual。各派生クラスはこれらのメソッドをオーバーライドします。これにより、に応じて適切なメソッドを呼び出すことができます。ポインターではなく具体的​​なオブジェクト型。

基本クラスのポインターを介して派生クラスに固有のメソッドを呼び出す必要がある場合は、明示的なキャストが必要です。dynamic_castクラスがポリモーフィックな場合は、a を使用することをお勧めします。ただし、これを頻繁に行う必要がある場合は、設計で何かを見逃している可能性があり、設計を再検討する必要があることに注意してください。

于 2013-04-23T03:07:44.857 に答える
2

明示的なキャストなしではありませんか?

基本クラス ポインターを使用して仮想関数を呼び出す場合は、明示的なキャストを使用する必要はありません。基本クラス ポインターが指しているオブジェクトの型に基づいて、実行時に決定されます。

非仮想関数を呼び出す場合、派生クラス オブジェクトを基底クラス ポインターに割り当てる場合、派生クラスの非仮想関数を呼び出す必要がある場合は、キャストが必要です。

上記は、次の結果を説明する必要があります。

A* a = new B(); //don't miss ; 
//you use base class pointer to point to derived class object
((B*)a)->b_only_func();              
//identical - prints Hello. b_only_func is not virtual, 
//you need cast in order to really call B's function, 
//otherwise, you will get compile error since 
//b_only_func() is not a member of a
a->a_only_func();    // prints a only func.
a->a_virtual_func();   // prints derived. this is expected because of polymorphism
((B*)a)->a_virtual_func();           // prints derived, not needed in this case
delete a;
于 2013-04-23T03:11:47.603 に答える