重写C++中的成员变量



考虑以下代码:

#include <iostream>
using namespace std;
class A {
public :
int i;
int j;
void print() {
cout << i << "t" << j << endl;
}
};

class B : public A {
public:
int f;
int g;
int i;

void print() {
A::print();
cout << f << "t" << g<<endl;

}

};

int main()
{
B obj;
obj.f = 1;
obj.g = 2;
obj.i = 3;
obj.A::i = 4;
obj.j = 5;
obj.print();
cout << obj.i;

}

输出为:

4       5
1       2
3

很明显,print函数已经打印了i的值,该值与父类相关,但与覆盖类无关。我的问题是,为什么print函数打印的是父类的i,而不是覆盖类的i?

您通过A(父类的(print函数打印了i。您的类有两个i,而Aprint只知道在哪里可以找到其中一个(来自A的那个(。如果要打印Bi,必须使用B方法(知道在哪里可以找到它(。

可以A上创建一个virtual访问器方法,提供对i的访问,并让B覆盖它,而Aprint使用它(而不是直接访问i(,因此它可以从B中看到i,但这是最好的。它之所以有效,是因为方法可以是virtual(根据运行时类型动态查找(,并且如果访问器在A上是虚拟的,并且在B上被重写,则当Aprint调用它时会找到B方法,而B的方法在B中看到定义。

最新更新