首页 > 解决方案 > 如何影响派生类中受保护的基变量

问题描述

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

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

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

提前致谢!

标签: c++oopinheritance

解决方案


您的代码正在有效地做

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。它们是同一种车(a Ford,后者是特别的蓝色版),但它们不是一种车(一个是你的,一个是我的)。驾驶一辆不会改变另一辆的里程数。

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

制作i一个static变量会在所有实例之间“同步”它 - 就好像Ford每辆车总是连接到互联网并将更改广播i到所有其他Fords。想象一下static int i“所有(蓝色)福特驾驶的总里程数”计数器。但请注意,static变量不再存在于其中一个实例中(它不存储在每个实例中Ford),而是集中在某个地方(某些福特公司服务器)。

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


推荐阅读