【问题标题】:How to modify a base class variable from 2 child classes如何从 2 个子类修改基类变量
【发布时间】:2019-01-15 02:22:16
【问题描述】:

这是我的问题的简化版本,我想使用来自 2 个子类的函数修改基类中的变量(我的原始代码中的二维向量),同时保留修改后的变量并显示它。

基本上我想修改基类中声明的变量,通过调用不同子类的同名函数,修改后的变量将与所有子类共享。对不起,我对多态性的理解不好,还在努力消化。

PS:我从下面删除了构造函数和虚拟析构函数,否则stackoverflow不会让我通过。

#include <iostream>

using namespace std;

class Shape
{
    protected:
    int test[3];

    public:
    virtual void chgValue() {}
    void setInitialValue();
    void showValue();
};

void Shape::setInitialValue() //sets test to {1,2,3}
{
    test[0]=1;
    test[1]=2;
    test[2]=3;
}

void Shape::showValue() //display elements of test
{
    for(int i=0;i<3;i++)
        cout<<test[i]<<" ";
}

class Square : public Shape //child class 1
{
    public:
    void chgValue()
    {
        test[1]=5;
    }
};

class Triangle : public Shape //child class 2
{
    public:
    void chgValue()
    {
        test[2]=7;
    }
};

int main()
{
    Shape a;
    Square b;
    Triangle c;

    Shape *Shape1=&b;
    Shape *Shape2=&c;

    a.setInitialValue(); //sets test to {1,2,3}
    Shape1->chgValue(); //change test[1] to 5
    Shape2->chgValue(); //change test[2] to 7
    a.showValue();  //shows 1 2 3 instead of 1 5 7

    return 0;
}

预期输出为 1 5 7,但实际输出为 1 2 3。

【问题讨论】:

  • abc 都是独立的实例
  • 尝试致电Shape1-&gt;showValue(), Shape2-&gt;showValue()
  • 也许你想要static int test[3];。它在所有实例之间共享test
  • Shape1->showValue(), Shape2->showValue() 将显示除修改后的随机数,静态给出对'Shape::test'的未定义引用
  • 我为您提供了提示,而不是解决方案,因为您的目标不清楚。如果你不理解它们并且不能很好地编写代码我建议你从stackoverflow.com/questions/388242/…开始

标签: c++ polymorphism


【解决方案1】:

我猜你在这里误解了 OOP 的概念:

Shape a;
Square b;
Triangle c;

这意味着您已经定义了三个不同的对象,它们在 RAM 中占据三个独立的内存区域。

a.setInitialValue();

这只是设置a 对象的int test[3]; 的元素。

Shape *Shape1=&b;
Shape *Shape2=&c;

Shape1->chgValue();
Shape2->chgValue();

这应该分别改变bc 对象的int test[3]; 元素;这不会影响a 对象。

毕竟int test[3];的元素是:

  • a: 1 2 3
  • b: x 5 x
  • c: x x 7

注意:这里的 x 表示 未确定(可能是 RAM 中残留的一些垃圾)。


更新以解决 OP 的 cmets

如果你真的想“修改基类中声明的变量,通过调用不同子类的同名函数,修改后的变量将与所有子类共享”,那么你可以在Shape静态中声明int test[3];,如下:

class Shape
{
  protected:
    static int test[3];

  public:
    // other code goes here
    // ...
};

int Shape::test[3];

// other code goes here
// ...

【讨论】:

  • 我明白了,所以不能通过多态来解决问题?
  • 正在使用多态性。您也没有明确说明您要解决的问题。根据您的问题,您似乎希望修改一个对象的数据也应该修改另一个对象的数据。
  • @yun1001 这不是多态性旨在解决的问题。
  • @yun1001 我更新了我的答案以解决您可能想要做的事情。
  • @yun1001 很高兴知道这一点。感谢您的接受!
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 2021-10-14
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多