在这(对象编程)方面我是一个新手,我试图从继承的类访问然后更改一个受保护的数组。但是,当我在派生类中对其进行更改时,它不会在基类中进行更改,这就是我想要做的。
有没有办法将这两者连接起来,就像通过引用传递函数参数时一样?
#include <iostream>
using namespace std;
class a {
protected:
int i=0;
public:
void print(){
cout<<i<<endl;
}
}a;
class b : protected a {
public:
void print(){
i++;
cout<<i<<endl;
}
}b;
int main(){
a.print(); //0
b.print(); //1
a.print(); //0 - I want this to be 1
return 0;
}
谢谢!
答案 0 :(得分:3)
您的代码正在有效地执行
Ford myFord; // a a;
BlueFord yourFord; // b b;
myFord.printMileage(); // a.print();
yourFord.driveAndPrintMileage(); // b.print(); <- does more than printing!
myFord.printMileage(); // a.print();
在行驶myFord
时,yourFord
的里程没有理由改变。它们是同一种汽车的{strong>种类(一种Ford
,后者是特殊的蓝色版本),但它们不是同一种汽车( )(一种是您的,其中之一是我的)。驾驶一个不会改变另一个的里程。
您对每个类/变量的类型(Ford
)和实例(myFord
)使用相同的名称。这些本质上是不同的东西,给它们相同的名称并不能使它们一成不变(只会使事情变得更令人困惑)。
为i
设置一个static
变量会在所有实例之间“同步”它-好像每辆Ford
汽车总是连接到互联网并广播对{{1}的更改}移至所有其他i
。想象Ford
为“所有(蓝色)福特曾经驾驶的总英里数”计数器。但是请注意,static int i
变量不再存在于一个实例中(它没有存储在每个static
中),而是集中在某个位置(某些福特公司的服务器)。
但是,面向对象编程的整个思想都摆脱了全局状态(包括Ford
变量),并让每个实例管理自己的状态。我不希望我的static
依赖于某些外部连接与其他所有Ford
进行通话。
答案 1 :(得分:0)
a
和b
是不相关的对象,每个对象都有其自己的i
成员变量副本。 a.i
和b.i
是不同的变量,因此更改一个变量不会影响另一个变量。
此外,您的班级名称选择不当。您有一个a
类和一个a
对象。只是令人困惑。请大写类名的首字母。将它们命名为A
和B
。
您似乎想要在这里做的是在同一个对象上调用两个不同的print()
函数 。您可以这样做:
B b_obj; // Create an object of type B
b_obj.A::print(); // Calls A::print() on b_obj
b_obj.print(); // Calls B::print() on b_obj
b_obj.A::print(); // Calls A::print() on b_obj
请注意,print()
函数存在问题。 A
和B
都有一个,这在处理多态时会导致一些令人惊讶的行为。但是,我认为您尚未达到该目标。现在,请记住,除非将基本函数标记为virtual
,否则在派生类中具有与基类中的函数同名的成员函数可能会非常麻烦。但是我想您很快就会来这本书的那一部分(或者您用来学习C ++的任何东西)。