多级继承/多态性和虚函数

Multilevel inheritance/polymorphism and virtual function

本文关键字:函数 多态性 继承 多级      更新时间:2023-10-16

我有一个多级继承(来自船类->医疗船类->医疗类),虚函数代码如下。我想结果应该是:

医生 10
医生 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;
}

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

Medic newMedic;

而不是

MedicShip newMedic;

也许?因此,不会调用 Medic 构造函数,也不会初始化weighttypeName

~Ship(){};

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