【问题标题】:Visual C++ - Cannot call derived class functionsVisual C++ - 无法调用派生类函数
【发布时间】:2014-04-22 06:54:42
【问题描述】:

// 在我正在制作的垄断游戏中,我有一个名为 Square 的基类。从中派生的类之一称为 freeParking。 freeParking 类有一个名为 playSquare 的函数,我正在尝试调用此函数,但是 main 中的 playSquare 函数调用给了我错误。这是我尝试使用的代码:

//方形基类

#pragma once
 #include <string>
 #include <iostream>

using namespace std;

class Square
{
public:
    Square(string d);
    string displayName();
private:
    string squareName;

};

// 继承自 Square 类的 freeParking 类

#pragma once
#include "Square.h"
#include "Player.h"
#include <iostream>

class freeParking : public Square
{
public:
freeParking(string a);
void playSquare(Player *player, Player *otherPlayer);


private:

};

//freeParking playSquare函数

#include "FreeParking.h"

using namespace std;

freeParking::freeParking(string a)
    :Square(a)
{

}

void freeParking::playSquare(Player *player, Player *otherPlayer)
{
    cout << "Player " << player->returnPlayerPiece() << " lands on free parking" << endl;
    cout << "Player " << player->returnPlayerPiece() << " is resting" << endl;
}

//在main中调用playSquare函数

vector <Square> squaresVector;
Square* square = new freeParking(squares[readCount]);
squaresVector.push_back(*square);

int a = 0;
for (vector<Square>::iterator it = squaresVector.begin(); it <squaresVector.end(); it++)
    {
        squaresVector[a]->playSquare(Player *p1, Player *p2);
            a++;
    }

//任何想法我做错了什么?干杯。

【问题讨论】:

    标签: visual-c++ inheritance polymorphism derived-class


    【解决方案1】:

    您还没有使playSquare 成为Square 接口的一部分。似乎您希望 playSquare 特定于正方形的类型,但您还希望能够在不知道 Square 的类型的情况下在 Square* 上调用它。为此,请将playSquare 设为虚拟方法。

    class Square {
        string squareName;
    
    public:
        Square(string d);
        string displayName();
        virtual void playSquare(Player* p1, Player* p2) = 0; 
        ...
    };
    

    virtual 添加到派生类中playSquare 声明的前面。这是一个纯虚函数,这意味着它不是在基类中定义的,而是必须在任何实际实例化的派生类中定义。如果您不喜欢此限制,请将= 0 替换为{} 以为其提供一个空的默认定义。我的猜测是,给定游戏板的上下文,您需要为每个派生类定义一个定义。

    编辑

    您不能使用std::vector 来存储多态对象(具有虚函数的对象)。向量只会为其模板参数的类型分配内存,在这种情况下为Square。任何与派生类相关的数据都将被截断。您可以改用std::vector&lt;Square*&gt; 来解决此问题。由于对象不再存储在向量中,我们不再有这个问题。

    在相关说明中,您无法在不知道 Square 类型的情况下复制 Square 对象,因为 Square 复制构造函数不知道如何处理对象的 freeParking 部分.您的push_back 操作试图做到这一点。

    我还注意到,您无缘无故地使用了两个循环计数器。摆脱a,因为您已经定义的迭代器允许您访问向量的每个元素。

    for(vector<Square*>::iterator it = squaresVector.begin(); it != squaresVector.end(); ++it) {
        (*it)->playSquare(p1, p2); //p1 and p2 are of type Player*
    }
    

    我怀疑您是否打算在传递 playSquare 的参数时声明它们。

    【讨论】:

    • 您好,感谢您的帮助,现在可以使用了。但是,如果我将正方形存储在数组中,它就会为正确的派生类调用适当的函数。但是,当从我原始帖子中定义的向量调用它时,它会调用基类 playSquare 函数(我不想调用)任何进一步的建议?
    • 我编辑了我的答案,包括我在仔细检查时发现的其他几个错误。
    猜你喜欢
    • 2021-09-14
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多