我在指针和参考理解方面存在问题。 我有以下代码段:
class U
{
protected:
int m;
public:
U(int m = 0) : m(m) {}
virtual void f() { cout << "U::f() @ m = " << m << endl; }
};
class V : public U
{
int n;
public:
V(int m, int n) : U(m), n(n) {}
void f() { cout << "V::f() @ m = " << m << ", n = " << n << endl; }
};
int main() {
V v1(1, 1), v2(2, 2);
v1.f();
v2.f();
U* u = &v1;
*u = v2;
v1.f();
v2.f();
}
我运行它,输出是:
V::f() @ m = 1, n = 1
V::f() @ m = 2, n = 2
V::f() @ m = 2, n = 1
V::f() @ m = 2, n = 2
我不理解第三行输出:V::f() @ m = 2, n = 1
。为什么m
更改为2
?
答案 0 :(得分:3)
*u=v2;
这不会使u
指向v2
。它会将v2
分配给U
指向的对象的u
子对象,即U
v1
部分。这是因为*u
是U
对象。
答案 1 :(得分:0)
首先 * u = v2; 不会让你指向v2。首先你被解除引用,它相当于 (U)v1 = v2;
因为类U只包含U :: int m所以只使用赋值操作修改了m。