如何在C++中改变超类和子类的变量

How to change the variables of super class from subclass in C++?

本文关键字:子类 变量 超类 改变 C++      更新时间:2023-10-16

我是OOP的新手,所以我试图创建一个实现继承的程序。在这里,我接受派生类中的宽度和高度值。有没有办法在超类中反映相同的值,即矩形。?即,如果iam在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;
    }

您已经在更改Rectangle类中的变量。但是您有两个实例,一个(rect)派生自Rectangle,另一个(rect1)派生自RectangleArea,因此rect.Display返回未定义的值——其Input方法尚未调用。

没有必要在超类中"反映"相同的值,因为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;
}

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

所以,在OOP中很难思考你设置事物的方式,因为矩形区域不是。。。一个矩形!有意义的是一类闭形,然后该类的一个成员可能是面积,因为所有闭形都有有限的面积。那么闭合图形的子类可以是矩形。和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

我不太明白你在问什么,因为你已经并正在改变矩形超类的宽度和高度。我想对你的代码做的改变是将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;
}

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

继承的问题是,无论何时从某个对象继承,现在都可以访问(某种所有权)该类中的所有公共和受保护实体。因此,任何矩形区域对象都可以对矩形中允许的高度或宽度进行任何操作。