如何在C ++中从子类更改超类的变量?

时间:2016-03-24 18:51:35

标签: c++ oop inheritance

我是OOP的新手,所以我试图创建一个实现继承的程序。我接受派生类中宽度和高度的值。有没有办法在超类中反映相同的值,即矩形另外,如果我在RectangleArea的Input()中输入3和4作为广度和高度,那么它应该在Rectangle类的Display()中显示相同的值。

    #include <iostream>

    using namespace std;

    class Rectangle
    {
    public:
        int width;
        int height;
    public:
        void Display()
        {
            cout<<"Height"<<height<<",Width"<<width<<endl;
        }
    };

    class RectangleArea : public Rectangle
    {
    public:
        void Input()
        {
            cin>>width;
            cout<<" ";
            cin>>height;
        }
        void Display(int area)
        {
            cout<<"Area"<<area;
        }
    };

    int main()
    {
        Rectangle rect;
        RectangleArea rect1;
        rect1.Input();
        rect.Display();
        return 0;
    }

4 个答案:

答案 0 :(得分:2)

您已在更改Rectangle课程中的变量。但是你有两个实例,一个(rect)派生自Rectangle,一个(rect1)来自RectangleArea,因此rect.Display返回未定义的值 - { {1}}方法尚未被调用。

答案 1 :(得分:1)

没有必要反映&#34;超类中的值相同,因为heightwidth是超类的成员,而不是子类。我想你想要做的是从子类中删除Display函数,让超类处理打印。

所以,您需要以下代码:

#include <iostream>

using namespace std;

class Rectangle
{
public:
    int width;
    int height;
public:
    void Display()
    {
        cout<<"Height"<<height<<",Width"<<width<<endl;
    }
};

class RectangleArea : public Rectangle
{
public:
    void Input()
    {
        cin>>width;
        cout<<" ";
        cin>>height;
    }
};

int main()
{
    RectangleArea rect1;
    rect1.Input();
    rect1.Display();
    return 0;
}

答案 2 :(得分:0)

我不太明白你在哪里,并且正在改变矩形超类的宽度和高度。关于你的代码我会改变的是将Display方法从基类中删除到你的超类中,所以它看起来像这样:

#include <iostream>

using namespace std;

class Rectangle
{
public:
    int width;
    int height;
public:
    void DisplayHeightAndWidth()
    {
        cout<<"Height"<<height<<",Width"<<width<<endl;
    }
    void DisplayArea()
    {
        cout << "Area" << (height*width) << endl;
    }
};

class RectangleArea : public Rectangle
{
public:
    void Input()
    {
        cin>>width;
        cout<<" ";
        cin>>height;
    }
    void Display(int area)
    {
        cout<<"Area"<<area;
    }
};

int main()
{
    Rectangle rect;
    RectangleArea rect1;
    rect1.Input();
    rect.Display();
    return 0;
}

但是我认为将你的类称为矩形区域是没有意义的,因为它永远不会对矩形区域做任何事情,它只会输入它。

继承的东西是,无论何时从某个东西继承,您现在都可以访问该类中的所有公共实体和受保护实体(所有权类型)。因此,任何RectangleArea对象都可以对允许在Rectangle中完成的高度或宽度执行任何操作。

答案 3 :(得分:0)

我不认为你在继承方面有正确的想法,这就是为什么这个问题感觉有点奇怪。当你想到OOP和课程时,你正试图“分类”事物。例如,您可以创建一类车辆。如果我们考虑车辆,我们知道这类物体应该具有速度 - 因为它们将你从一个地方带到另一个地方。子类可以是不同类别的对象,但仍然是车辆的对象。例如,汽车是车辆,它们将具有速度,加上它们自己独特的成员变量,例如车轮数量,或每加仑英里数等等。所有汽车应具有的某些属性。

所以,在OOP中很难想象你设置的方式,因为矩形区域不是......一个矩形!一些有意义的东西是一类闭合形状,然后该类的一个成员可能是Area,因为所有封闭的数字都有限区域。那么封闭数字的子类可以是矩形。像Mark B一样,我建议你选择一个好的C ++文本。

class ClosedFigure {
    private: 
        unsigned int area;
    public: 
        void displayArea() { cout << area << endl;};
};

class Rectangle : public ClosedFigure {
    private: 
        // already gets area from ClosedFigure
        unsigned int length;
        unsigned int width;
    public: 
        void getDimensions() { 
            cin >> length >> width; 
            area = length * width
        }
};

ClosedFigure a;
Rectangle b;
b.getDimensions();
// User inputs say 3 and 4
b.displayArea();
// program outputs 12