子类无法访问父类的变量

时间:2012-11-02 01:32:19

标签: c++ pointers inheritance virtual-functions

我正在创建一个程序,我有一个Square类,它是Shape类的子类

但是当子类尝试从父类访问变量时,我的程序崩溃了。

这是我的代码:

class Shape2D
{
public:
    string shape;
    void setShape(string newShape);
    string getShape();

    string specialType;
    void setSpecialType(string newSpecialType);

    vector <int> shapeXCoordi;
    void setshapeXCoordi(int newshapeXCoordi);

    vector <int> shapeYCoordi;
    void setshapeYCoordi(int newshapeYCoordi);
    void toString();

    virtual int computeArea()
    {
        return 0;
    }
    void displayArea();
};

出于测试目的,我只让这个computeArea()返回x坐标。

class Square : public Shape2D
{
public:
    int computeArea()
    {
        return shapeXCoordi[0];
    }
};

int main()
{
    if (aShape2D[0].getShape() == "Square")
    {
        Shape2D *pShape2D;
        pShape2D = &aSquare;

        cout << "Area: " << pShape2D -> computeArea()  << endl;
    } 
}

我做了几个测试,如果我要将return shapeXCoordi[0];更改为return 123;,它可以正常运行。

我也试过return shape;但它不会显示任何内容,虽然这次它不会崩溃。

因此我猜测SquareClass尝试从shapeXCoordi[0]

访问ShapeClass时出现问题

任何人都可以在这种情况下启发我吗?

1 个答案:

答案 0 :(得分:0)

您需要先通过调用setshapeXCoordi来初始化构造函数中的shapeXCoordi。由于您正在访问未初始化的vectorXCoordi,因此其中没有元素。因此,当您使用[0]访问它时,它会返回错误。

您可以在computeArea()中添加一个完整性检查,以确保在访问shapeXCoordi之前有一个元素:

int computeArea()
{
    assert(shapeXCoordi.size() != 0);
    return shapeXCoordi[0];
}

另外,我建议使用.at(0)而不是[0],这样你就可以获得实际的错误处理而不是崩溃。