2
#include<stdio.h>

class parent
{
public:
    parent()
    {
    }
};

class child : public parent
{
public:
    child()
    {
    }
};

class master
{
public:
    void view(parent a)
    {
        printf("view parent instances");
    }
    void view(child b)
    {
        printf("view child instances");
    }
};

int main()
{
    parent *ptr;
    master mymaster;

    ptr = new child;

    mymaster.view(*ptr);

    return 0;
}

output : "view parent instances" 親クラスからポインタを作成します。次に、そのポインターを子型として宣言しました。mymaster.view(*ptr); を実行すると 、これは常に最初のビュー関数 (void ビュー (親 a)) に移動し、それを (void ビュー (子 b)) に移動する方法。ありがとうございました

4

4 に答える 4

4

ちょっとしたリファクタリングと少し異なるアプローチで、virtual関数を使用できます。これにより、以下のようなポインターを使用して呼び出されたときに、派生クラスの関数を使用できるようになります。

#include<stdio.h>

class parent
{
public:
    parent()
    {
    }
    virtual void view()
    {
      printf("View parent");
    }
};

class child : public parent
{
public:
    child()
    {
    }
    virtual void view()
    {
      printf("View child");
    }
};

class master
{
public:
    void view(parent *a)
    {
        a->view();
    }
};

int main()
{
    parent *ptr;
    master mymaster;
    ptr = new child;
    mymaster.view(ptr);
    return 0;
}

これにより、 "View child"が出力されます。virtualキーワードなしの同じコードは、"View parent"を出力します。キーワードは親クラスにのみ存在する必要がありますが、わかりやすくするために派生クラスでも使用されることが多いことに注意してください。

仮想関数に関するウィキペディアの記事は、状況を非常によく説明しています。

仮想機能は「遅く」解決されます。問題の関数が基本クラスで「仮想」である場合、ポインターまたは参照の宣言された型に関係なく、参照されるオブジェクトの実際の型に従って、関数の最も派生したクラスの実装が呼び出されます。「仮想」でない場合、メソッドは「早期」に解決され、呼び出された関数は、ポインターまたは参照の宣言された型に従って選択されます。

ここでのオブジェクトの実際の型はchildであるため、ポインターが型であっても、仮想関数によって確実にchildの機能が呼び出されます。

于 2013-05-22T18:58:38.373 に答える
0

の型*(parent*)parentであるため、呼び出されるメソッドは ですview(parent)。を呼び出したい場合は、渡す前にview(child)ポインタを a にキャストする必要がありますが...child*

OOP を逆方向に使用しています。サブクラスの特定のタイプごとに消費する方法を知っている複数のメソッドを定義するのではなく、親クラスによって提供されるコントラクトを尊重できる 1 つのメソッドを定義し、サブクラスは内部で独自のことを行います。

于 2013-05-22T18:57:19.847 に答える
0

ptrparentオブジェクトへのポインタです。関数を呼び出したい場合は、オブジェクトを関数呼び出しview(child)に渡す必要があります。child

childまたは、ポインターにキャストすることもできます

mymaster.view(*(child*)ptr);

しかし、他のあらゆる種類の問題が発生する可能性があります。

于 2013-05-22T18:57:29.893 に答える