C语言模式实现C++继承和多态的实例代码
这个题目首要考查的是C和C++的区别,以及C++中担任和多态的观念。 C和C++的区别 C说话是面向进程的说话,而C++是面向工具的进程。 什么是面向工具和面向进程? 面向进程就是说明办理题目的步调,然后用函数把这些步调一步一步的举办实现,在行使的时辰举办逐一挪用就行了,注重的是对付进程的说明。面向工具则是把组成题目的事举办分成各个工具,成立工具的目标也不只仅是完成这一个个步调,而是描写各个题目在办理的进程中所产生的举动。 面向工具和面向进程的区别?
面向工具的三大特性 封装: 对付封装来说就是数据与详细操纵实现的代码都放在某个工具的内部,使这些代码的详细细节不被外界发明,只留下一些接供词外部来行使,而不能一任何的情势来工具内部的实现。行使封装可以或许潜匿详细的实现的细节,使代码越发易于维护而且担保了体系的安详性。 担任: 担任机制是面向工具措施计划使代码举办复用的最重要的本领,他应承措施员在担保类原有类特征的基本长举办扩展来增进成果。这样新发生的类就被称为派生类,担任就可以示意面向工具机制的的条理布局。 多态: 多态简朴点说就是“一个接口,多种实现”,就是统一种事物示意出的多种形态。多态在面向工具说话中是指:接口多种的差异实现方法。也就是复用沟通接口,实现差异操纵。 C++多态支持两种多态性,编译时多态和运行时多态。编译时多态是通过重载函数来实现的,运行时多态是通过虚函数来实现的。静态多态:编译器在编译时代完成,编译器按照函数实参的范例(也许会隐式范例转换),可揣度出要挪用哪个函数,假若有对应的函数就挪用响应的函数,不然就报一个编译错误。动态多态:在函数执行时代(非编译期)判定所引用工具的现实范例,按照现实范例的挪用响应的要领。行使virtual要害字修饰类的成员函数,指明该函数为虚函数,派生类必要从头实现,编译器将实现动态绑定。 动态多态实现的前提: 1>、行使场景:父类的指针可能引用指向父类可能子类的工具(由赋值兼容法则抉择); 2>、实现多态的两个前提:虚函数的重写;父类的指针可能引用挪用重写的虚函数。 3>、若父类中的成员函数加上virtual要害字,则子类中重写的该函数默认virtual,可以不指定,可是一样平常加上; 重写:子类重写父类的虚函数,要求函数名称,函数参数,返回值完全一样(协变除外); 总的来说:封装可以潜匿实现细节包罗包括私有成员,使得代码模块增进安详指数;担任可以扩展已存在的模块,为了增进代码的复用性;多态则是为了担保类在担任和派生的时辰,类的实例被正确挪用,实现了接口的重用 C模仿实现多态 C++中的多态 我们知道的是在C++中会维护一张虚函数表,按照赋值兼容法则,我们知道父类的指针可能引用是可以指向子类工具的。假如一个父类的指针可能引用挪用父类的虚函数则该父类的指针会在本身的虚函数表中查找本身的函数地点,假如该父类工具的指针可能引用指向的是子类的工具,并且该子类已经重写了父类的虚函数,则该指针会挪用子类的已经重写的虚函数。 //c++中的多态 class A { public: virtual void fun()//虚函数实现 { cout << "Base A::fun() " << endl; } }; class B:public A { public: virtual void fun()//虚函数实现,子类中virtual要害字可以没有 { cout << "Derived B::fun() " << endl; } }; void Test1() { A a;//基类工具 B b;//派生类工具 A* pa = &a;//父类指针指向父类工具 pa->fun();//挪用父类的函数 pa = &b; //父类指针指向子类工具,多态实现 pa->fun();//挪用派生类同名函数 } c说话实现多态 我们知道在C说话中是没有class类这个观念的,可是有struct布局体,我们可以思量行使struct来模仿;可是在C说话的布局体内部是没有成员函数的,假如实现这个父布局体和子布局体共有的函数呢?我们可以思量行使函数指针来模仿。可是这样处理赏罚存在一个缺陷就是:父子各自的函数指针之间指向的不是相同C++中维护的虚函数表而是一块物理内存,假如模仿的函数过多的话就会不轻易维护了。 //C实现动态,用到函数指针 typedef void(*FUN)();//重界说一个函数指针范例 //父类 struct Base { FUN _f; }; //子类 struct Derived { Base _b;//在子类中界说一个基类的工具即可实现对父类的担任 }; void FunB() { printf("%sn","Base::fun()"); } void FunD() { printf("%sn","Derived::fun()"); } void Test2() { Base b;//父类工具 Derived d;//子类工具 b._f = FunB;//父类工具挪用父类同名函数 d._b._f = FunD;//子类挪用子类的同名函数 Base *pb = &b;//父类指针指向父类工具 pb->_f(); pb = (Base *)&d;//让父类指针指向子类的工具,因为范例不匹配以是要举办强转 pb->_f(); } 以上就是本文的所有内容,但愿对各人的进修有所辅佐,也但愿各人多多支持编程小能力。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |