-1

以下のコードで、非表示/オーバーライドに関して次の質問があります。

1)pを使用してDoStuffを呼び出す場合、どのDoStuff実装が呼び出されますか?

2)ドライブのプリウス実装から「仮想」キーワードを削除しても、DoStuff(p)は引き続き機能しますか?

3)DoStuff(t)を除いて、上記と同じですか?

4)に変更Car* cするToyota *t

(上記の質問に固有でない一般的なアドバイスは大歓迎です)

class Car
{
public:
    virtual void Drive();
};

class Toyota : public Car
{
public:
    virtual void Drive();
};

class Prius : public Toyota
{
public:
    virtual void Drive();
};


void DoStuff(Car* c)
{
    c->Drive();
}

int main()
{
    Car* c = new Car();
    Toyota* t = new Toyota();
    Prius* p = new Prius();

    DoStuff(c);
    DoStuff(t);
    DoStuff(p);
}
4

1 に答える 1

1

1) p で DoStuff を呼び出すと、どの DoStuff 実装が呼び出されますか?

自分の目で確かめてください(コードも修正しました)

2) ドライブの Prius 実装から「virtual」キーワードを削除しても、DoStuff(p) は機能しますか?

一度仮想化すると、常に仮想化されます(つまり、基本クラスで関数が として宣言されている場合virtual、それは常にvirtual派生クラスにあり、宣言されているかどうかに関係なくvirtual)

3) DoStuff(t)? 以外は上記と同じ。

上記を参照。

4)Car* c変更Toyota *t

この質問に答えるために、既にリンクした例を推測します (これが何を求めているのかわからないため)。

virtual5)から削除するとどうなりCarますか?

あなたはこの質問をしませんでしたが、私はあなたがしたことを望みます. 前の例はすべて、オーバーライドを処理する必要があります。これを行うと、関数が隠蔽されます。派生クラスが言ってvirtualも、基本クラスが機能を隠蔽していない場合

于 2013-03-04T17:16:27.670 に答える