虚函数相关
虚函数
在基类中声明为virtual并在一个或多个派生了中重新定义的成员函数。作用:是实现多态性,多态性是将接口和实现进行分离。多态有个关键之处:用指向基类的指针或引用来操作对象。
<span style="font-size:14px;">class animal
{
public:
void Funct1(){cout<<"Animal!\n";}
};
class dog : public animal
{
public:
void Funct1(){cout<< "Dog!\n";}
};
int _tmain(int argc, _TCHAR* argv[])
{
animal *p = NULL;
animal a;
dog d;
p = &a;
p->Funct1();
p = &d;
p->Funct1();
return 0;
}</span>
运行这段代码发现输出都是"Dog",注意:不管引用的实例是哪个类的,系统会调用左值对象所属类的方法。这里p是animal的指针。这种叫静态联编,编译器在编译时就确定了。如果想实现跟据实例的不同来动态决定调用哪个函数呢?这就须要用到虚函数(也就是动态联篇)。
class animal
{
public:
virtual void Funct1(){cout<<"Animal!\n";}
};
class dog : public animal
{
public:
virtual void Funct1(){cout<< "Dog!\n";}
};
所谓虚函数就是在编译的时候不确定要调用哪个函数,而是动态决定将要调用哪个函数。它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,编译器就可以使用后期绑定来达到多态了,也就是:用基类的指针来调用子类的这个函数。要实现虚函数必须保证派生类的函数名与基类相同,参数名参数类型等也要与基类相同。但派生类中的virtual关键字可以省略,也表示这是一个虚函数。
定义虚函数的限制:
非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。最好将析构函数定义为虚函数因为,当利用delete删除一个指向派生定义的对象指针时,系统会调用相应类的析构函数。
纯虚函数
纯虚函数是一种特殊的虚函数,在多数情况下,基类中不能对虚函数给出有意义的实现,而把它声明为虚函数,它的实现留给该基类的派生类去做,这就是纯虚函数的作用。
纯虚函数的一般格式如下:
<pre name="code" class="cpp">class<类名>
{
virtual <类型><函数名>(<参数表>)=0;
…
};
纯虚函数可以先让类具有一个操作名称,而没有操作内容,让派生类在继承时再去给出定义,凡是含有虚函数的类叫做抽象类。这种类不能声明对象,只能作为基类为派生类服务,除非派送类实现了基类中所有的纯虚函数,否则派送类也变成了抽象类而不能实例化对象。一般纯虚函数的函数体是缺省的,但是也可以给出纯虚函数的函数体,调用纯虚函数的方法为baseclass::virtual function.
若要使派生类为非抽象类,则编译器要求在派生类中必须对纯虚函数予以重写实现多态性,同时含有虚函数的类称为抽象类。
多态性:
指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种
多态性
:编译时
多态性
,
运行时多态性
。
a.编译时
多态性
:通过
重载函数
和运算符重载实现。
b运行时
多态性
:通过虚函数和继承实现。
虚函数
纯虚函数
注意:1、构造函数不能是虚函数,而且构造函数中调用虚函数,实际执行的是父类对应函数,因为自己还没有构造,多态是无效的。2、纯虚函数通常没有定义体,但也可以有。3、析构函数可以使纯虚的,但是纯虚析构函数必须有定义体,因为析构函数的调用是在子类中隐含的。4、非纯虚函数必须有定义体,否则是个错误。