虚函数

一。首先说一下,虚函数咋用的

虚函数是在基类中,对成员函数进行声明的,当然构造函数和友元函数都不可以声明为虚函数

声明要加virtual,但是定义的时候不用加virtual,在派生类的声明中可加可不加,最好加上吧。

virtual void name()

 

二。为什么使用虚函数

对呀,为什么呢

如果我们不使用虚函数

比如一个基类class father,其派生类class son

那么一个基类的指针或者引用

father *f   /father &f,

当他指向的是一个派生类的对象的时候

即(以引用为例)

father &f = son s;

假如基类一个成员函数是show(),派生类修改了其show()

当我们调用f.show(),调用的是基类的show(),而不是派生类的

这就叫做静态联编,即在编译的时候我们就知道调用哪个函数快了,

但是如果show使用了虚函数的话,那么f.show调用的是派生类修改过的show,这就是动态联编,即只有在运行的时候,

他才知道调用了哪个函数快,因为他调用的是引用指向的对象的函数,而不是引用对应的类型的函数

这就是为什么析构函数一般会是虚函数,如果我们使用基类的引用,释放的时候,只释放了基类的引用,但是真正的对象的内存是没有被释放的,会造成内存泄漏。

三。工作原理

有点不清楚

 

说是给每个对象一个指针,该指针指向一个数组,数组里存着是这些虚函数的地址,所以数组叫做虚函数表

基类有一个指针,指向虚函数表的地址,派生类也有一个指针,他俩指的地方不一样,但是如果虚函数没有变化,里面虚函数的地址都是一样的额,如变化了,派生类指向的虚函数表里内容就发生变化

所以每一个对象都又个指针,每次都这个虚函数表中拿到自己对应函数的地址,然后找到该函数。

所有有些缺点对于虚函数来说:

(1)每个对象都要增大,因为他包含了一个指针

(2)每个类都得创建一个虚函数的地址表

(3)每个函数调用都需要额外的时间进行在表中查找地址。

 

四。为什么构造函数和友元函数不能位虚

当创建派生类对象的时候,会调用派生类的构造函数啊,而不是基类的的构造函数,为什么要虚呢

还有就是调用虚函数是在对象创建以后,来通过对象来调用的,而构造函数是来创建对象的,对象都没创建成立,怎么调用构造函,

友元不是类的成员函数呢,所以不能虚

你可能感兴趣的:(C++)