c++中虚函数和纯虚函数的作⽤与区别
多态性与虚函数
虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以⼦类中可以重写也可以不写基类中的此函数!
纯虚函数在基类中是没有定义的,必须在⼦类中加以实现,很像java中的接⼝函数!
虚函数
引⼊原因:为了⽅便使⽤多态特性,我们常常需要在基类中定义虚函数。
class Cman
{
public:
virtual void Eat(){……};
void Move();
private:
};
class CChild : public CMan
{
public:
virtual void Eat(){……};
private:
};
CMan m_man;
CChild m_child;
CMan *p ;//这才是使⽤的精髓,如果不定义基类的指针去使⽤,没有太⼤的意义
p = &m_man ;
p->Eat(); //始终调⽤CMan的Eat成员函数,不会调⽤ CChild 的
p = &m_child;
p->Eat(); //如果⼦类实现(覆盖)了该⽅法,则始终调⽤CChild的Eat函数
//不会调⽤CMan 的 Eat ⽅法;如果⼦类没有实现该函数,则调⽤CMan的Eat函数
p->Move(); //⼦类中没有该成员函数,所以调⽤的是基类中的
纯虚函数
引⼊原因:
1、同“虚函数”;
2、在很多情况下,基类本⾝⽣成对象是不合情理的。例如,动物作为⼀个基类可以派⽣出⽼虎、孔雀等⼦类,但动物本⾝⽣成对象明显不合常理。
纯虚函数就是基类只定义了函数体,没有实现过程,定义⽅法如: virtual void Eat() = 0; 不要在cpp中定义;纯虚函数相当于接⼝,不能直接实例话,需要派⽣类来实现函数定义;
有的⼈可能在想,定义这些有什么⽤啊,我觉得很有⽤,⽐如你想描述⼀些事物的属性给别⼈,⽽⾃⼰不想去实现,就可以定义为纯虚函数。说的再透彻⼀些。⽐如盖楼房,你是⽼板,你给建筑公司描述清楚你的楼房的特性,多少层,楼顶要有个花园什么的,建筑公司就可以按照你的⽅法去实现了,如果你不说清楚这些,可能建筑公司不太了解你需要楼房的特性。⽤纯需函数就可以很好的分⼯合作了
虚函数和纯虚函数区别
观点⼀:
类⾥声明为虚函数的话,这个函数是实现的,哪怕是空实现,它的作⽤就是为了能让这个函数在它的⼦类⾥⾯可以被重载,这样的话,这样编译器就可以使⽤后期绑定来达到多态了
纯虚函数只是⼀个接⼝,是个函数的声明⽽已,它要留到⼦类⾥去实现。
class A{
protected:
void foo();//普通类函数
virtual void foo1();//虚函数
virtual void foo2() = 0;//纯虚函数
}
观点⼆:
虚函数在⼦类⾥⾯也可以不重载的;但纯虚必须在⼦类去实现,这就像Java的接⼝⼀样。通常我们把很多函数加上virtual,是⼀个好的习惯,虽然牺牲了⼀些性能,但是增加了⾯向对象的多态性,因为你很难预料到⽗类⾥⾯的这个函数不在⼦类⾥⾯不去修改它的实现
观点三:
虚函数的类⽤于“实作继承”,继承接⼝的同时也继承了⽗类的实现。当然我们也可以完成⾃⼰的实现。纯虚函数的类⽤于“介⾯继承”,主要⽤于通信协议⽅⾯。关注的是接⼝的统⼀性,实现由⼦类完成。⼀般来说,介⾯类中只有纯虚函数的。
观点四:
带纯虚函数的类叫虚基类,这种基类不能直接⽣成对象,⽽只有被继承,并重写其虚函数后,才能使⽤。这样的类也叫抽象类。
虚函数是为了继承接⼝和默认⾏为
纯虚函数只是继承接⼝,⾏为必须重新定义

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。