有一个抽象类 Human
#pragma once
#include "stdafx.h"
class Human
{
protected:
string name;
int age;
int exp;
int magicNumber;
public:
Human(void);
Human(string name, int age, int exp);
~Human(void);
public:
int getMagic();
void Print();
public:
virtual bool Shoot();
virtual double getCoef();
};
bool Human::Shoot()
{
return false;
}
它有 3 个继任者(Beginner、Experienced、Veteran),其中重新定义了 Shoot 功能
bool Beginner::Shoot()
{
return (0.01 * exp > magicNumber) ? true : false;
}
如果您使用动态数组,那么多态会很好地工作,并且会调用类继承人的函数。
Human **shooters = new Human*[7];
shooters[0] = new Beginner("Ivan", 22, 3000);
shooters[1] = new Beginner("Sasha", 17, 1500);
shooters[2] = new Beginner("Dasha", 20, 3300);
shooters[3] = new Experienced("Hitman", 29, 6500);
shooters[4] = new Veteran("Polkovnik", 55, 10000);
shooters[5] = new Experienced("Motorolla", 35, 7000);
shooters[6] = new Beginner("Maxim", 22, 4000);
for (int i = 0; i < 7; i++)
{
cout << shooters[i]->getMagic() << " : " << shooters[i]->getCoef() <<((shooters[i]->Shoot()) ? "Попал" : "Мимо!") << endl;
}
但是如果使用静态数组,就会调用基类的虚方法。
Human shooters[7] = {Beginner("Ivan", 22, 3000),
Beginner("Sasha", 17, 1500),
Beginner("Dasha", 20, 3300),
Experienced("Hitman", 29, 6500),
Veteran("Polkovnik", 55, 10000),
Experienced("Motorolla", 35, 7000),
Beginner("Maxim", 22, 4000)};
for (int i = 0; i < 7; i++)
{
cout << shooters[i].getMagic() << " : " << shooters[i].getCoef() <<((shooters[i].Shoot()) ? "Попал" : "Мимо!") << endl;
}
注意问题:为什么会这样?
@user7860670 在评论中提供了答案。
创建基类实例数组是错误的。您只需要写入指向数组的指针。
可以使用任何数组。静态或动态。甚至对象本身也可以是静态的。最重要的是要有一个指针数组。由于它们可以指向任何类的元素,并且指针的大小是相同的。
错误是这样的:
或者
,但正确的方法是:
或者