C++多态的学习总结
来源:互联网 发布:uc独角兽 知乎 编辑:程序博客网 时间:2024/06/16 23:01
多态的总结:
1 .多态的含义就是动态绑定,对于同样的函数名在编译时无法确定调用调用哪个函数,就是说在编译的时候无法将函数名与函数地址绑定,只有在运行的才能确定调用的函数版本,才能将函数名与具体的函数地址绑定。
2 . 多态的具体实现就是虚函数的实现:即用一个指向子类对象的父类引用(父类指针),在函数调用时可以调用到正确版本的函数。表现形式有以下几种。
- 用一个父类指针指向一个子类对象,如果在父类中被覆盖的函数被声明为virtual的话,就可以用这个指向子类对象的父类指针(引用)来调用到子类版本的重新定义的虚函数。
- 在一个普通函数内用父类引用(指针)作为形参,这样就可以用这个指针接收到任何它的子类对象包括它自己。(这样就可以在函数体内用父类指针调用被父类中被覆盖的函数(声明为virtual的函数),会根据传入对象的不同而调用不同版本的覆盖函数。从而实现以同样的代码来实现不同的操作)。
- 在复合类(组合类)中,尽量引用高层次的类(别的父类指针)当做类的成员变量,这样就可以通过它创建出它所对应的任何子类包括它自己。
- 在容器(集合)中,可以声明一个父类指针的容器,这时可以往容器中添加它所对应的任何子类包括它自己。
#include <iostream>using namespace std;class Base{ private : int i=100; public : virtual void print(){ cout<<"In parent Base menber i= "<<i<<endl; }};class Derived1:public Base{ private : int a=1; public : virtual void print(){ cout<<"In son Derived1 a= "<<a<<endl; }};class Derived2:public Base{ private : int b=2; public : virtual void print(){ cout<<"In son Derived2 b= "<<b<<endl; }};void Interface(Base &b)//或void Interface(Base *b),实参改为“&子类或父类的对象地址{ b.print();/*动态绑定,在编译时不能确定print()函数的绑定地址,只有在运行时才能确定函数版本。从而实现多态*/ /*利用虚函数实现多态,以同样的函数,同样的代码可以执行不同的操作*/}int main(int argc, const char * argv[]){ Derived1 d1; Derived2 d2; Base &b1=d1; b1.print(); Base &b2=d2; b2.print(); Base *b; /*虚函数实现多态的第一种方式:以指向子类对象的父类指针(父类引用)来调用子类重写父类的成员函数*/ b=&d1; b->print(); b=&d2; b->print(); cout<<"==============================="<<endl; Interface(d1); /*多态的第二种方式:以父类指针(引用)为形参,以子类或父类对象为实参用传地址(引用)的方式为函数提供 0.不同版本虚函数的实现*/ Interface(d2); return 0;}运行结果如下:
实例验证二 代码如下:
#include <iostream>using namespace std;class Base{ public : virtual void print(){ cout<<"parent Base print()"<<endl; }};class Derived1:public Base{ public : void print(){ cout<<"Derived1 print()"<<endl; }};class Derived2:public Base{ public : void print(){ cout<<"Derived2 print()"<<endl; }};class Derived3:public Base{ public : void print(){ cout<<"Derived3 print()"<<endl; }};class Complex{ private : Base *b; public : Complex(Base *b1){ b=b1;} void display(){ b->print(); }};int main(int argc, const char * argv[]){ Derived1 d1; Derived2 d2; Derived3 d3; Base b; Complex c(&b);/*多态实现的第三种方式:在复合类中,声明高层次类(父类)的指针作为成员, 就可以调用所有的父类以及继承的子类对象了*/ c.display(); Complex c1(&d1); c1.display(); Complex c2(&d2); c2.display(); Complex c3(&d3); c2.display(); return 0;}
运行结果如下:
0 0
- C/S的学习总结
- 学习c语言的总结
- protobuf-c的学习总结
- protobuf-c的学习总结
- 对十四天的c学习的总结
- C/C++日常学习总结(第五篇)多态和虚函数的访问
- C/C++的一学习总结
- Objective-C学习阶段的知识点总结
- 学习C语言的一点总结
- c语言学习的阶段性小总结
- 关于C指针的学习总结
- 学习C语言的指针总结
- Objective-C学习阶段的知识点总结
- object-c 基础动画的学习总结
- 我的c语言学习总结
- C语言操作符的学习总结
- 六年前学习的C语言,重新学习的总结
- 【c++】多态总结
- spyder不能启动
- 【n!素因子p的幂】swjtuOJ 2090
- 南邮 OJ 1948 参赛选手信息更新问题
- 电信和联通要合并?
- 视频通话研究001
- C++多态的学习总结
- hdoj 5045 期望dp
- Java垃圾回收调优
- 实战响应式图片
- 统计字符串中不同类型字符的个数
- iis7、iis8配置备份还原
- UVA - 10003 Cutting Sticks
- 网址
- 南邮 OJ 1949 比赛成绩排序问题