0

以下のように、仮想関数コードを使用した複数レベルの継承 (Ship クラス -> MedicShip クラス -> Medic クラス) があります。結果は次のようになるはずです:

メディック 10
メディック 10

しかし、それは奇妙な結果を生み出しました。一方、1 つのレベルの継承 (Ship クラス -> MedicShip クラスを介さずに Medic クラス) のみを使用すると、結果は OK になります。私の間違いを見つけていただけますか?多くの感謝....

#ifndef FLEET_H
#define FLEET_H
#include <string>
#include <vector>

using namespace std;

class Ship
{
    public:
        Ship(){};
        ~Ship(){};
        int weight;
        string typeName;

        int getWeight() const;
        virtual string getTypeName() const = 0;
};

class MedicShip: public Ship
{
    public:
        MedicShip(){};
        ~MedicShip(){};
        string getTypeName() const;
};

class Medic: public MedicShip
{
    public:
        Medic();
};

class Fleet
{
    public:
        Fleet(){};
        vector<Ship*> ships;
        vector<Ship*> shipList() const;
};
#endif // FLEET_H



#include "Fleet.h"
#include <iostream>

using namespace std;

vector<Ship*> Fleet::shipList() const
{
    return ships;
}

int Ship::getWeight() const
{
    return weight;
}

string Ship::getTypeName() const
{
    return typeName;
}

string MedicShip::getTypeName() const
{
    return typeName;
}

Medic::Medic()
{    
    weight = 10;    
    typeName = "Medic";
}

int main()
{
    Fleet fleet;
    MedicShip newMedic;

    fleet.ships.push_back(&newMedic);
    fleet.ships.push_back(&newMedic);

    for (int j=0; j< fleet.shipList().size(); ++j)
    {
        Ship* s =  fleet.shipList().at(j);
        cout << s->getTypeName() << "\t" << s->getWeight() << endl;
    }

    cin.get();
    return 0;
}
4

2 に答える 2

1

クラス のインスタンスを作成していませんMedic。ということでしたか

Medic newMedic;

それ以外の

MedicShip newMedic;

多分?したがって、Medicコンストラクターは呼び出されweighttypeNameおらず、初期化されていません。

于 2012-04-28T07:59:45.330 に答える
0
~Ship(){};

最初の間違いはここにあります。このデストラクタは virtual、基本クラスポインタを介して派生クラスオブジェクトを削除する場合に使用する必要があります。

于 2012-04-28T07:51:35.887 に答える