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

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() 函数有什么作用? ab 是不相关的实例。 @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 的更改广播到所有其他Fords .将static int i 想象为“所有(蓝色)福特驾驶的总里程数”计数器。但请注意,static 变量不再存在于其中一个实例中(它不存储在每个 Ford 中),而是位于中心位置(某些福特公司服务器)。

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

【讨论】:

【参考方案2】:

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++ 的任何东西)。

【讨论】:

以上是关于如何影响派生类中受保护的基变量的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 在派生类中静态初始化基类受保护的成员变量

C#如何将新变量的基类中的变量值更改为派生类

编译器不应该对派生类中隐藏的基结构的成员变量发出警告吗?

访问派生类中的受保护成员

访问派生类中的基类成员

c ++中受保护的派生和私有派生有啥区别[重复]