我有两个班级:
class x {
public:
virtual void hello() {
std::cout << "x" << std::endl;
}
};
class y : public x {
public:
void hello() {
std::cout << "y" << std::endl;
}
};
有人可以解释为什么以下两次调用hello()会打印不同的消息吗?他们为什么不打印“y”?是因为第一个是副本而第二个实际指向内存中的对象吗?
int main() {
y a;
x b = a;
b.hello(); // prints x
x* c = &a;
c->hello(); // prints y
return 0;
}
答案 0 :(得分:6)
是的,你是对的
x b = a;
调用复制构造函数(b IS为'x')
x& b = a;
指定一个引用并使用覆盖(b实际上仍然是'y')
答案 1 :(得分:6)
因为x b = a;
slices是对象。
当此代码执行时,它会创建一个新的x
,而不是y
,它是原始y
,a
'的副本。
答案 2 :(得分:0)
x b = a
将a复制到b。由于b是类型x,因此最终得到x类型的对象。 x类型的对象将打印x。
获得y的唯一方法是调用y类型的对象。
答案 3 :(得分:0)
b.hello()
打印“x”,因为b
是类X的实例。c->hello()
打印“y”,因为c
指向a
,{ {1}}是Y类的实例。
可能让您感到困惑的是,当您撰写a
时,您正在创建新对象x b = a;
并使用b
对其进行初始化。当您编写a
时,x* c = &a;
不是新对象。您刚刚为现有对象引入了别名。