C++基础6:虚函数、纯虚函数

1、概念 
虚函数:为了允许用基类的指针来调用子类的这个函数,子类可以重写父类的虚函数。
纯虚函数:为了实现一个接口,起到一个规范的作用,规范继承的子类必须实现这个函数。纯虚函数不可实例化对象 


2、实例化对象
有纯虚函数的类是不可能生成类对象的,如果没有纯虚函数则可以。比如: 
class CA 

public: 
    virtual void fun() = 0;  // 说明fun函数为纯虚函数 
    virtual void fun1();      // 虚函数
}; 

class CB 

public: 
   virtual void fun(); 
   virtual void fun1(); 
}; 

void main() 

    CA a;   // 不允许,因为类CA中有纯虚函数 
    CB b;   // 可以,因为类CB中没有纯虚函数 
    ... 



3、多态
虚函数的参数对于编译器来说,在编译时刻并不知道传进来的是父类还是子类,具体到运行时决定了才决定用那个函数。也就是说用父类指针通过虚函数来决定运行时刻到底是谁,指向谁的函数。


4、纯虚函数

纯虚函数就是基类只定义了函数体,没有实现过程定义方法如下

 virtual void Eat() = 0; 直接=0 ,纯虚函数相当于接口,不能直接实例话,需要派生类来实现函数定义

有的人可能在想,定义这些有什么用啊 ,我觉得很有用比如你想描述一些事物的属性给别人,而自己不想去实现,就可以定义为纯虚函数。



5、虚函数和纯虚函数区别

5.1

虚函数:这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,这样编译器就可以使用后期绑定来达到多态

纯虚函数:只是一个接口,是个函数的声明而已,它要留到子类里去实现。


5.2

虚函数:在子类里面也可以不重载的

纯虚函数:必须在子类去实现,这就像Java的接口一样。通常我们把很多函数加上virtual,是一个好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,因为你很难预料到父类里面的这个函数不在子类里面不去修改它的实现


5.3

虚函数:类用于“实作继承”,继承接口的同时也继承了父类的实现。当然我们也可以完成自己的实现。

纯虚函数:类用于“介面继承”,主要用于通信协议方面。关注的是接口的统一性,实现由子类完成。一般来说,介面类中只有纯虚函数的。



6、虚基类和非虚基类的区别

派生类构造函数的调用次序有三个原则:  

(1)虚基类的构造函数在非虚基类之前调用

(2)若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用

(3)若虚基类由非虚基类派生而来,则仍先调用基类构造函数,再调用派生类的构造函数.



7、使用虚基类时要注意

(1) 一个类可以在一个类族中既被用作虚基类,也被用作非虚基类。  

(2) 在派生类的对象中,同名的虚基类只产生一个虚基类子对象,而某个非虚基类产生各自的子对象。  

(3) 虚基类子对象是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。  

(4) 最远派生类是指在继承结构中建立对象时所指定的类。  

(5) 派生类的构造函数的成员初始化列表中必须列出对虚基类构造函数的调用;如果未列出表示使用该虚基类的缺省构造数。  

(6) 从虚基类直接或间接派生的派生类中的构造函数的成员初始化列表中都要列出对虚基类构造函数的调用。但仅仅用建立对象的最远派生类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类的构造函数的调用在执行中被忽略,从而保证对虚基类子对象只初始化一次。  

(7) 在一个成员初始化列表中同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非虚基类的构造函数执行。



发布了69 篇原创文章 · 获赞 37 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/xi_gua_gua/article/details/60511931
今日推荐