首先:强调一个概念
定义一个函数为虚函数,不代表该函数为不被实现的函数
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数
定义一个函数为纯虚函数,才代表函数没有被实现
定义他是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
(
纯虚函数就是父类不给定义,子类必须要实现这个函数,不然子类不能被具象化
虚函数的话父类也要给定义,因为子类可以不实现这个虚函数而沿用父类的虚函数
)
对继承的影响:
普通的类(没有虚函数,纯虚函数)就可以被继承,而且工作的相当好
*****************************************************************************************************************************************
关于实例化一个类:
有纯虚函数的类是不可能生成类对象的,如果没有纯虚函数则可以。比如:
class CA
{
public:
virtual void fun() = 0; // 说明fun函数为纯虚函数
virtual void fun1();
};
class CB
{
public:
virtual void fun();
virtual void fun1();
};
// CA,CB类的实现
...
void main()
{
CA a; // 不允许,因为类CA中有纯虚函数
CB b; // 可以,因为类CB中没有纯虚函数
...
}
**************************************************************************************
(以下都是我自己的总结)
对“虚函数是为了允许用基类的指针来调用子类”这句话的理解:
设Parent是父类,Child是子类
Parent parent;
Child Child;
父类中有function1和function2这两个函数,
并且function2是虚函数。
当我们在程序中,使用 Parent *p; // 定义一个基类指针
p=&child; // 指向继承类对象 ~~~或者用 p=new Child()这样的形式,
这里就是用基类的指针(p)来调用子类,(因为把子类的对象赋给了它)
如果基类的函数中没有virtual的话,就算是把子类的对象赋值给了父类指针,由于静态联编,指针p永远都只调用父类的方法
但是,若父类的某个方法用virtual修饰了,变成了虚函数,那么,这时virtual就起作用了,这个p 将会调用Child类的function2,而不是父类的function2~~
若Parent类还有一个子类,叫Child2
当执行
Parent *p;
p=new Child2();
时,就能体现出virtual的功劳了,动态联编会选择执行Child2这个类的function2函数,而不是基类的function2函数