class A{
public:
virtual void Say(){
std::cout<<"I am A"<<std::endl;
}
};
class B: public A{
public:
void Say() override{
std::cout<<"I am B"<<std::endl;
}
};
int main(){
B b;
A a1;
A a2=b;
b.Say(); // I am B
a1.Say(); // I am A
a2.Say(); // I am A why???
}
B(对象 b)派生自 A(对象 a1 和 a2)。 b 和 a1,如我们所料,调用它们的成员函数。但是从多态性的角度来看,我们不期望由 b 分配的 a2 不会被覆盖。基本上,a2 只保存 b 的 A 类部分,即 C++ 中的对象切片。
当数据成员被切片时发生对象切片时,我看到所有提到的答案。这里我举一个例子,这些方法没有被覆盖:
B(对象 b)派生自 A(对象 a1 和 a2)。 b 和 a1,如我们所料,调用它们的成员函数。但是从多态性的角度来看,我们不期望由 b 分配的 a2 不会被覆盖。基本上,a2 只保存 b 的 A 类部分,即 C++ 中的对象切片。
为了解决这个问题,应该使用引用或指针
或者