虚函数:
成都创新互联是专业的稷山网站建设公司,稷山接单;提供网站建设、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行稷山网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
1)只有成员函数才能被声明为虚函数,静态成员函数不行,原因是静态成员函数在编译期就已经
确定和哪个类绑定了,而虚含数是动态绑定的,在运行时才知道和哪个类绑定
2)虚函数覆盖的版本,必须和该函数在基类中的原始版本一样,即函数名,形参名,常属性一样
3)如果基类中的虚函数返回类类型的指针(A*)或引用(A&),那么允许子类覆盖版本返回B*或(B&)
4)基类中的虚函数不管是在什么访控属性(public,protected,private)下,都能被子类继承(public),子
类类名无法调用(因为虚函数不是静态的)
哪些函数可以声明为虚函数?
成员函数 0k
静态成员函数 no
全局函数 no
析构函数 ok
操作符重载函数 ok
注意:
1)多态特性除了要在基类中声明虚函数,并在子类中提供有效的覆盖外,还必须通过指针或引用来调用,才能表现出多态
2)调用虚函数的指针可以是this指针,只要它是一个指向子类对象的基类指针
3)当基类的构造函数被子类的构造函数调用时,子类对象尚未构造完成,不能说是子类类型的,它只能表现出基类类型的外观和行为,这时调用虚函数,只能被绑定倒基类的版本,无多态特性
4)当基类的析构函数在被子类的系够函数调用时,子类对象已经不再是子类类型,它只能表现出基类的外观和行为,调用此析构函数,只能被绑定倒基类版本,没有多态特性.
5)虚函数在基类中,可以实例化
2.纯虚函数
virtual 返回类型 函数名(形参表)[const] =0;
3.抽象类
1)一个类中包含了至少一个纯虚函数
2)抽象类不能实例化对象
3)如果子类没有覆盖其基类中的全部纯虚函数,那么该子类就是一个抽象类
4)纯虚函数不管是在什么访控属性下(public,protected,private),都能被子类继承
6)纯虚函数在基类中不能定义.
5)虚函数也为成员函数,而不是静态成员函数,这里不再罗嗦了
4.动态绑定对性能的影响
1)动态绑定会增加内存开销
2)虚函数的调用会增加时间的开销
3)虚函数不能被内联优化
//虚函数主要是用基类指针或引用来调用子类函数来形成多态 #include <iostream> class A{ public: //这里肯定时public,不然没法通过基类指针调用字类函数 virtual void print(void){ std::cout << "A::print()" <<std::endl; } }; class B:public A{ private: void print(void){//注意重载和覆盖的区别,这里为覆盖, //即子类的基类函数一样,只是函数体不一样 std::cout << "B::print()" << std::endl; } }; int main(void){ B b; A& a = b; a.print(); //B中的print(),如果把class A中的virtual去掉,调用 //的就是A中的print()了 return 0; }
名称栏目:虚函数和纯虚函数,抽象类
本文URL:https://www.cdcxhl.com/article20/ispdco.html
成都网站建设公司_创新互联,为您提供小程序开发、品牌网站设计、企业网站制作、品牌网站制作、App设计、外贸网站建设
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联