如何影响派生类中受保护的基变量

How to affect protected base variable in derived class

本文关键字:受保护 变量 派生 何影响 影响      更新时间:2023-10-16

我对此(对象编程)很陌生,我正在尝试访问然后更改继承类中的受保护数组。但是当我在派生类中更改它时,它在基类中不会更改,这就是我想做的。

有没有办法连接这两者,比如当你通过引用传递函数参数时?

#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;
}

提前感谢!

你的代码正在有效地做

Ford myFord;                     // a a;
BlueFord yourFord;               // b b;
myFord.printMileage();           // a.print();
yourFord.driveAndPrintMileage(); // b.print(); <- does more than printing!
myFord.printMileage();           // a.print();

没有理由在驾驶yourFord时改变myFord的里程。它们是同一种汽车(Ford,后者是特别的蓝色版),但它们不是同一辆车(一辆是你的,一辆是我的)。驾驶一个不会改变另一个的里程。

每个类/变量的类型(Ford)和实例(myFord)使用相同的名称。这些是根本不同的东西,给它们起相同的名字并不能使它们成为一回事(它只会让你更困惑)。

istatic变量将在所有实例之间"同步"它 - 就好像每辆Ford汽车始终连接到互联网并将更改广播到i到所有其他Fordstatic int i。但请注意,static变量不再存在于其中一个实例中(它不是存储在每个实例中Ford),而是集中在某个地方(一些福特公司的服务器)。

但是面向对象编程的整个思想是摆脱全局状态(包括static变量),让每个实例管理自己的状态。我不希望我的Ford不断与所有其他Ford交谈,依靠一些外部联系。

ab是不相关的对象,每个对象都有自己的i成员变量副本。a.ib.i是不同的变量,因此更改一个不会影响另一个。

此外,您的类名选择不当。您有一个a类和一个a对象。这简直令人困惑。改为将类名的第一个字母大写。将它们命名为AB

似乎您在这里要做的是在同一对象上调用两个不同的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()函数存在问题。AB都有一个,这在处理多态性时会导致一些令人惊讶的行为。但是,我假设您还没有达到该部分。现在,请记住,在派生类中具有与基类中的函数同名的成员函数可能会非常成问题,除非基函数标记为virtual。但我想你很快就会读到这本书的这一部分(或者你用来学习C++的任何内容)。