我正在研究C ++中的继承和多态,我遇到了这个例子:
class Parent
{
public:
void a()
{
std::cout << "parentA";
}
virtual void b()
{
std::cout<<"parentB";
}
};
class Child : public Parent
{
public:
void b()
{
std::cout<<"childB";
}
};
然后在主要:
int main()
{
Parent i= Child();
i.b(); //why doesn't this give parentB?
Parent *j= new Child();
j->b();
}
输出分别是parentA和childB,但我不明白为什么。 (不是b()重写?)
答案 0 :(得分:3)
第一种情况应该是parentB
,因为对象i
的类型为Parent
,而不是Child
。 Child
对象切片 - 也就是说,复制其Parent
子对象以创建i
类型的Parent
,然后临时{{1}被摧毁了。您通常可以通过使基类 abstract (即,为它们提供纯虚拟函数)来防止这样的混乱行为,从而无法实例化它们。
第二种情况应该是Child
,因为childB
指向的对象具有动态类型j
。
答案 1 :(得分:2)
您已将Child
班级“切片”到Parent
班级。为了访问虚拟方法,您需要以多态方式存储实例,就像您的第二个示例一样。多态变量是指针和引用。