2

次の単純なポリモーフィズムを考えてみましょう...

class Parent {
public:
    someFunc() { /* implementation A */ };
};

class Child : public Parent {
public:
    someFunc() { /* implementation B */ };
};

int main ()
{
    Parent* ptr;

    ptr = new Parent();
    ptr->someFunc();
    delete ptr;

    ptr = new Child();
    ptr->someFunc();
    delete ptr;

    return 0;
}

私の知る限り、どちらの場合も実装Aが呼び出されます。

ptrの動的タイプに応じて、someFuncの「最も派生した」実装をどのように呼び出すことができますか?

私の実際のコードには多くの子タイプがあるため、dynamic_castを使用して子クラスごとにチェックするのは実用的ではありません。

4

3 に答える 3

4

試す:

class Parent 
{
    public:
         virtual someFunc() { /* implementation A */ };
       //^^^^^^^
};

技術的には必要ありませんが。
派生関数を仮想として宣言するのも良いスタイルだといつも思っています。

class Child : public Parent 
{
    public:
        virtual someFunc() { /* implementation B */ };
};

Java関数とは異なり、デフォルトでは仮想ではありません。

于 2010-10-13T20:49:23.413 に答える
3

someFunc仮想を宣言します。これにより、ポインタタイプに応じた実装ではなく、実際のオブジェクトの実装が呼び出されるようになります。

ただし、これにより、VTABLEの作成に関連するオーバーヘッドが追加され、仮想関数の呼び出しが遅くなりますが、本質的にはポリモーフィズムです。

于 2010-10-13T20:49:21.697 に答える
2

ここにはポリモーフィズムはありません!あなたの関数はどれもvirtualです。

ポリモーフィズムが必要な場合は、次のようにします。

class Parent {
public:
    virtual someFunc() { /* implementation A */ };
};
于 2010-10-13T20:50:20.117 に答える