如何影响派生类中受保护的基变量
Posted
技术标签:
【中文标题】如何影响派生类中受保护的基变量【英文标题】:How to affect protected base variable in derived class 【发布时间】:2019-06-21 11:58:46 【问题描述】:我对这个(对象编程)很陌生,我正在尝试访问然后从继承的类中更改一个受保护的数组。但是当我在派生类中更改它时,它不会在基类中更改,这就是我想要做的。
有没有办法将这两者联系起来,比如通过引用传递函数参数?
#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;
提前致谢!
【问题讨论】:
a::out()
函数有什么作用?
a
和 b
是不相关的实例。
@vahancho 我猜out()
实际上是print()
您是否尝试过将变量设为静态,以便所有实例和派生实例共享?
静态变量与类相关联,而不是与类的特定实例相关联。所以类的所有实例都将访问/改变同一个类变量。你可能想买一本好的 C++ 书:***.com/questions/388242/…
【参考方案1】:
你的代码正在有效地做
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
正在行驶时发生变化。它们是同一种类的汽车(Ford
,后者是特殊的蓝色版),但它们不是同一汽车(一辆是你的,一辆是我的)。驾驶一辆不会改变另一辆的里程数。
您对每个类/变量的类型 (Ford
) 和实例 (myFord
) 使用相同的名称。这些是根本不同的东西,给它们起相同的名字并不会使它们成为一回事(只会让事情变得更混乱)。
将i
设为static
变量将在所有实例之间“同步”它 - 就好像每辆Ford
汽车始终连接到互联网并将i
的更改广播到所有其他Ford
s .将static int i
想象为“所有(蓝色)福特驾驶的总里程数”计数器。但请注意,static
变量不再存在于其中一个实例中(它不存储在每个 Ford
中),而是位于中心位置(某些福特公司服务器)。
但是面向对象编程的整个理念是摆脱全局状态(包括static
变量)并让每个实例管理自己的状态。我不希望我的 Ford
依赖一些外部连接不断地与所有其他 Ford
s 交谈。
【讨论】:
【参考方案2】: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++ 的任何东西)。
【讨论】:
以上是关于如何影响派生类中受保护的基变量的主要内容,如果未能解决你的问题,请参考以下文章