1、如果你以一个基础类别的指针指向衍生类的对象,那么经由该指针,你只能调用基础类所定义的函数。
{
BaseFunc();
}
Class CDerived :publci CBase
{
DeriFunc();
}
CBase * pBase;
虽然我们可以令pBase实际指向CDerived对象,却因为pBase的类型(一个CBase*指针),使它只能够调用BaseFunc(),不能够调用DerFunc()。
2、如果你以一个衍生类的指针指向一个基础类的对象,你必须先做明显的转型。这样做法很危险。
CDerived* pDeri;
CBase aBase("JaSon");
pDeri = &aBase; //这样做法很危险,不符合真实的生活经验。
3、如果基础类和衍生类都定义了相同名称的成员函数,那么透过对象指针调用成员函数时,到底调用哪一个函数,必须视该指针的原始类型而定,而不是由指针实际所指的对象类型来决定。
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
虚拟函数的作用:可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该成员函数)。若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都会调用基类中定义的那个函数。
虚函数是动态绑定的基础,是非静态的成员函数。在类的声明中,在函数原型之前写virtual。virtual 只用来说明类声明中的原型,不能用在函数实现时。具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
本质:不是重载声明而是覆盖。
调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。
纯虚拟函数不需要定义其实际动作,它的存在只是为了在衍生类中被重新定义,只是为了提供一个多态接口。只要是拥有纯虚拟函数的类,就是一种抽象类,它是不能够被具体化的。
有关虚拟函数的结论:
1、如果你期望派生类重新定义一个成员函数,那么你就应该在基础类中把此函数设为virtual。
2、以单一指令唤起不同函数,这种性质称为Polymorphism,意思是“the ability to many forms”,也就是多态。
3、虚拟函数是c++语言的多态性及动态绑定的关键。
4、既然抽象类中的虚拟函数不打算被调用,我们就不应该定义它,应该把它设为纯虚拟函数(在函数声明之后加上“=0”即可)。
5、抽象类不能产生具体的对象实体,但是我们可以拥有指向抽象类的指针,以便于操作抽象类的各个派生类。
6、虚拟函数派生下去仍为虚拟函数,而且可以省略virtual关键词。