关于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();
}
运行结果:
#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();
}
运行结果:
为什么两种情况都可以达到预期效果,而人们往往使用父类指针指向子类对象的方法呢?
第一种方法是支持多态的写法。
下面的方案如果使用Base指针去接Derived对象指针,然后调用show函数,调用的是Base::show。这样就会产生歧义:明明指针指向的Derived对象,调用的函数确实Base的方法。
人们往往使用父类指针指向子类对象的方法,这样做是为了使用C++的多态。程序设计中基类一般都是抽象出来的,变化的可能性比较小,写程序时某一段代码依赖的是抽象的基类指针有助于代码的稳定(需求变化时,这段代码不需要改动,只需要修改一下基类指针指向的对象就可以了)。
对象是类的实体化。Base* base = new Derived(1), 这个base指针指向的是一个被创建的Derived对象。调用show方法也是调用Derived对象对应的show方法。