0

我才刚刚开始真正了解多态性,但这对我来说仍然是一个新话题。所以这是我的问题:我必须上课,敌人和银行劫匪。然而,Bankrobber 继承自敌人。我试图制作一个由 10 个银行劫匪组成的数组。然后一个全局函数应该使用数组的所有成员来做某事,我想这是一个毫无价值的描述,所以这里是代码:

void UpdateEnemies(Enemy * p_Enemy, int counter) { 
    for(unsigned int i = 0;i < counter;i++) { 
        p_Enemy[i].Update(); 
    } 
}

int main(void) { 
    BankRobber EnemyArray[10]; 
    Enemy * p_Enemy = new BankRobber(13,1); 
    UpdateEnemies(EnemyArray,10); 
    system("PAUSE"); 
};   

对于任何语言错误,我深表歉意。我不是母语人士

我的实际问题:这段代码只是为了练习,所以目的只是为了在控制台上看到 10 次更新,对于数组的每个成员。所以函数 UpdateEnemys 应该调用所有的enemy.update 函数。类型转换的方法并不是我想要的,因为它不再是动态的,因为以后会有更多的敌人。不仅是银行劫匪。

4

3 回答 3

2

多态性仅适用于单个对象,通过引用或指向基类的指针访问。它不适用于对象数组:要访问数组元素,必须知道元素的大小,如果您有指向基类的指针,则情况并非如此。

您将需要一个额外的间接级别:指向单个对象的指针数组,沿着

void UpdateEnemies(Enemy ** p_Enemy, int counter) { 
    for(unsigned int i = 0;i < counter;i++) { 
        p_Enemy[i]->Update(); 
    } 
}

int main() {
    // An array of Enemy base-class pointers
    Enemy * EnemyArray[10]; 

    // Populate with pointers to concrete Enemy types
    for (unsigned i = 0; i < 9; ++i) {
         EnemyArray[i] = new BankRobber;
    }

    // Of course, the array can contain pointers to different Enemy types
    EnemyArray[9] = new Dragon;

    // The function can act polymorphically on these
    UpdateEnemies(EnemyArray,10);

    // Don't forget to delete them. Enemy must have a virtual destructor.
    for (unsigned i = 0; i < 10; ++i) {
         delete EnemyArray[i];
    }
}

您还应该考虑使用RAII类型(例如容器和智能指针)来管理这些动态资源;但这超出了这个问题的范围。

于 2013-09-04T12:50:34.357 回答
1

像这样声明一个 BankRobber 数组

BankRobber EnemyArray[10];

但不是像这样通过基类指针访问它们

Enemy * p_Enemy;    
p_Enemy[i].Update();

行不通。那是因为索引数组p_Enemy[i]将通过使用 offcet sizeof(Enemy)
Butsizeof(BankRobber)可能大于 from 来完成sizeof(Enemy),所以 p_Enemy[i] 最终会出现在错误的位置

您应该改用指针向量,例如

std::vector<Enemy*>

这样,如果您将指向不同对象的指针添加到向量中,您也可以使用多态性。而且你不需要传递丑陋int counter的东西

于 2013-09-04T12:46:57.730 回答
0

确实,您没有确切地说出问题所在。

您是否尝试在代码中进行强制转换?就像是:

void UpdateEnemies(Enemy * p_Enemy, int counter) { 
    BankRobber *pRobber = (BankRobber*)p_Enemy;
    for(unsigned int i = 0;i < counter;i++) { 
        pRobber[i].Update(); 
    } 
}
于 2013-09-04T12:45:03.933 回答