多级继承/多态和虚函数

时间:2012-04-28 07:43:26

标签: c++ function inheritance polymorphism virtual

我有一个多级继承(来自Ship类 - > MedicShip类 - > Medic类),其虚函数代码如下所示。我想结果应该是:

Medic 10
Medic 10

但它产生了奇怪的结果。另一方面,如果我只使用一级继承(从Ship类 - > Medic类中没有MedicShip类),结果将是正常的。你能找到我的错吗?非常感谢....

#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;
}

2 个答案:

答案 0 :(得分:1)

您尚未创建任何类Medic的实例。你的意思是说

Medic newMedic;

而不是

MedicShip newMedic;

也许?因此,Medic构造函数未被调用,weighttypeName未被初始化。

答案 1 :(得分:0)

~Ship(){};

第一个错误就在这里。如果要通过基类指针删除派生类对象,则此析构函数应为virtual