C ++中的多态性

时间:2014-01-20 14:21:20

标签: c++ inheritance polymorphism

我正在研究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()重写?)

2 个答案:

答案 0 :(得分:3)

第一种情况应该是parentB,因为对象i的类型为Parent,而不是ChildChild对象切片 - 也就是说,复制其Parent子对象以创建i类型的Parent,然后临时{{1}被摧毁了。您通常可以通过使基类 abstract (即,为它们提供纯虚拟函数)来防止这样的混乱行为,从而无法实例化它们。

第二种情况应该是Child,因为childB指向的对象具有动态类型j

答案 1 :(得分:2)

您已将Child班级“切片”到Parent班级。为了访问虚拟方法,您需要以多态方式存储实例,就像您的第二个示例一样。多态变量是指针和引用。