【发布时间】:2020-01-20 09:03:52
【问题描述】:
我无法理解切片是如何发生的?例如,在这段代码中:
class A {
public:
virtual h() {
cout << "type A" << endl;
}
};
class B : public A {
public:
virtual h() override {
cout << "type B" << endl;
}
};
void f(A a) {
a.h();
}
void g(A& a) {
a.h();
}
int main() {
A a1 = B(); // a1 is A and doesn't recognize any B properties
A *a = new B();
f(*a);
g(*a);
}
我注意到:
变量 a1 不知道它是 B,但变量 a 知道。我指的是这种情况正在发生,因为在变量 a1 中,对 B 的赋值是按值分配的,与变量 a 相反,我在其中创建了一个指向 B 的指针。
当我将变量 a 传递给不同的函数时,也会发生同样的事情 - 当我通过值传递时,它认为它是 A,但是当我通过引用传递时,它认为它是 B。
如果有人能给我更广泛和更深入的解释,我会很高兴。提前谢谢!
【问题讨论】:
-
当您通过值而不是通过引用接收实例时会发生这种情况。解决方法:不要。
-
请注意,整个“它认为它是 B”是因为你的类是 多态的。如果函数
h没有被声明为virtual它也不会工作,即使没有切片(比如使用指针或引用时)。 -
至于切片本身,如果您复制一个对象,那么切片就会发生。例如,在
A a1 = B();中,您复制由B()创建的(临时)对象,但只复制对象的A部分。当您执行A *a = new B;时,您不会复制对象本身,而是让a指向实际的B对象。 -
变量
a只“知道”它是一个A*- 一个指向A或派生自A的指针。正是a指向的对象知道它是B。
标签: c++ oop inheritance polymorphism pass-by-reference