考虑以下代码:
#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
,而A
的print
只知道在哪里可以找到其中一个(来自A
的那个(。如果要打印B
的i
,必须使用B
方法(知道在哪里可以找到它(。
可以在A
上创建一个virtual
访问器方法,提供对i
的访问,并让B
覆盖它,而A
的print
使用它(而不是直接访问i
(,因此它可以从B
中看到i
,但这是最好的。它之所以有效,是因为方法可以是virtual
(根据运行时类型动态查找(,并且如果访问器在A
上是虚拟的,并且在B
上被重写,则当A
的print
调用它时会找到B
方法,而B
的方法在B
中看到定义。