c++关于父类指针指向子类对象的一个问题

关于c++关于父类指针指向子类对象的一个问题,时间:在中午

#include <iostream>
class Base
{
public:
    Base(int a)
    {
        this->a = a;
    }
    virtual void show()
    {
        std::cout << "父类中a的值为:"<< a << std::endl;
    }
protected:
    int a;
};

class Derived :public Base
{
public:
    Derived(int a):Base(a)
    {
        this->a = a;
    }
    void show()
    {
        std::cout << "子类中a的值为:" << a << std::endl;
    }
};

int main()
{
    Base* base = new Derived(1);//此处用父类指针指向子类对象的方法
    base->show();
}


运行结果:

img

#include <iostream>
class Base
{
public:
    Base(int a)
    {
        this->a = a;
    }
    void show()//与上相比,此处不用virtual
    {
        std::cout << "父类中a的值为:"<< a << std::endl;
    }
protected:
    int a;
};

class Derived :public Base
{
public:
    Derived(int a):Base(a)
    {
        this->a = a;
    }
    void show()
    {
        std::cout << "子类中a的值为:" << a << std::endl;
    }
};

int main()
{
    Derived* derived = new Derived(1);//此处用子类指针指向子类对象的方法
    derived->show();
}


运行结果:

img

为什么两种情况都可以达到预期效果,而人们往往使用父类指针指向子类对象的方法呢?

第一种方法是支持多态的写法。

下面的方案如果使用Base指针去接Derived对象指针,然后调用show函数,调用的是Base::show。这样就会产生歧义:明明指针指向的Derived对象,调用的函数确实Base的方法。
人们往往使用父类指针指向子类对象的方法,这样做是为了使用C++的多态。程序设计中基类一般都是抽象出来的,变化的可能性比较小,写程序时某一段代码依赖的是抽象的基类指针有助于代码的稳定(需求变化时,这段代码不需要改动,只需要修改一下基类指针指向的对象就可以了)。

对象是类的实体化。Base* base = new Derived(1), 这个base指针指向的是一个被创建的Derived对象。调用show方法也是调用Derived对象对应的show方法。