只有一个代码:
void foo(A a){
a.speak();
}
class A{
public:
void speak(){cout << "A speak\n";}
};
class B : public A{
public:
void speak(){cout << "B speak\n";}
};
int main(){
A a;
B b;
foo(a);
foo(b);
}
从我阅读的书籍中,我了解到类型 A 的指针可以引用类 A 的女儿的对象,但这里对象 b 通过值传递给函数并且代码有效。我不明白为什么会发生这种情况,编译器不应该在这一行发誓吗?
该评论提到了“对象切片”,但这并不是您正在寻找的答案。粗略地说,在通话
foo(b);
中有抄袭。B 类型的对象被复制到 A 类型的对象中,并且发生“对象切片”。在您的示例中,没有数据丢失,但在真实对象中它们可以。例如:
B 类型的对象有两个字段。但如果你写:
b
有关的信息bar
丢失在a
.编译器对此并不发誓,因为这是它的“正常”行为。他可以简单地通过“不复制”字段来轻松解决这种情况。并且不会有错误,因为您的函数不需要类字段
B
。