gpt4 book ai didi

c++ - 如何从 2 个子类修改基类变量

转载 作者:行者123 更新时间:2023-11-30 03:18:58 25 4
gpt4 key购买 nike

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

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

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。

最佳答案

我猜你误解了 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 的评论

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

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

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

int Shape::test[3];

// other code goes here
// ...

关于c++ - 如何从 2 个子类修改基类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54191894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com