如何影响派生类中受保护的基变量
How to affect protected base variable in derived class
我对此(对象编程)很陌生,我正在尝试访问然后更改继承类中的受保护数组。但是当我在派生类中更改它时,它在基类中不会更改,这就是我想做的。
有没有办法连接这两者,比如当你通过引用传递函数参数时?
#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
)使用相同的名称。这些是根本不同的东西,给它们起相同的名字并不能使它们成为一回事(它只会让你更困惑)。
i
static
变量将在所有实例之间"同步"它 - 就好像每辆Ford
汽车始终连接到互联网并将更改广播到i
到所有其他Ford
static int i
。但请注意,static
变量不再存在于其中一个实例中(它不是存储在每个实例中Ford
),而是集中在某个地方(一些福特公司的服务器)。
但是面向对象编程的整个思想是摆脱全局状态(包括static
变量),让每个实例管理自己的状态。我不希望我的Ford
不断与所有其他Ford
交谈,依靠一些外部联系。
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++的任何内容)。
- 如何从其他结构访问受保护的结构变量
- 从模板化父类中的派生内部类访问受保护的成员变量
- C++中的受保护变量
- 如何影响派生类中受保护的基变量
- C++,如何创建线程限制/受保护的变量和函数
- 类的静态成员变量(受保护)的作用域
- 无法在受保护的类中显示变量
- 虚函数在受保护变量上触发编译错误
- 为什么我无法访问作为参数传递到函数中的基类的受保护成员变量?
- 访问受保护的变量 - 继承和子类的复杂情况
- 继承受保护的函数和公共变量C++时发生多重继承编译错误
- 为什么可以从派生实例访问基类中的受保护变量
- 继承中使用的受保护变量
- 有没有办法从类外部声明一个受保护C++变量?
- 访问派生类 C++ 中的受保护变量
- 受保护变量的命名和标准
- 重写派生类中的受保护变量
- 告诉子类对超类的受保护变量执行某些操作是否是一种好的做法(也许是一些已知的设计模式?)?
- 从类C访问类a中的受保护变量,其中C是B的子类,B是a的子类
- 如何访问子节点的受保护变量