c++ - 如何影响派生类中受保护的基变量
问题描述
我对此(对象编程)很陌生,我正在尝试访问然后从继承的类中更改受保护的数组。但是当我在派生类中更改它时,它不会在基类中更改,这就是我想要做的。
有没有办法连接这两者,比如当你通过引用传递函数参数时?
#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();
没有理由myFord
在行驶时改变里程数yourFord
。它们是同一种车(a Ford
,后者是特别的蓝色版),但它们不是同一种车(一个是你的,一个是我的)。驾驶一辆不会改变另一辆的里程数。
您对每个类/变量的类型( Ford
) 和实例 ( )使用相同的名称。myFord
这些是根本不同的东西,给它们起相同的名字并不能使它们成为一回事(它只会让你更困惑)。
制作i
一个static
变量会在所有实例之间“同步”它 - 就好像Ford
每辆车总是连接到互联网并将更改广播i
到所有其他Ford
s。想象一下static int i
“所有(蓝色)福特驾驶的总里程数”计数器。但请注意,static
变量不再存在于其中一个实例中(它不存储在每个实例中Ford
),而是集中在某个地方(某些福特公司服务器)。
但是面向对象编程的整个想法是摆脱全局状态(包括static
变量)并让每个实例管理自己的状态。我不希望我依靠一些外部联系不断地Ford
与所有其他人交谈。Ford
推荐阅读
- c++ - 在 C++ 中不使用关键字 new 在堆栈上创建实例
- javascript - Knex.js 用于查询作为一个查询
- python - 使用 Python pandas 读取镶木地板文件时出现“无效的起始字节”错误
- blockchain - 如何将链数据从一个仲裁网络传输到另一个?
- javascript - Nest JS 无法解析服务中的依赖关系
- c# - value.GetType().IsSubClassOf(ClassBase) 给我错误“'ClassBase' 是一种类型,在给定的上下文中无效”
- php-7.2 - 如何使用 PHP 7.2 计算 API 的响应时间?
- fonts - 2019 年是否有跨浏览器的方式在 Web 应用程序中包含字体?
- javascript - 将受信任的 JavaScript 注入 (Chrome) WebExtension
- asp.net - 在 plesk cpanel 中托管 asp.net core 2.1 的问题?