博客
关于我
多态体验,和探索爷爷类指针的多态性
阅读量:415 次
发布时间:2019-03-06

本文共 2961 字,大约阅读时间需要 9 分钟。

 

1. 多态初体验

#include 
#include
using namespace std;class Parent{public: virtual void print() { cout << "I'm Parent." << endl; }};class Child : public Parent{public: void print() { cout << "I'm Child." << endl; }};void how_to_print(Parent* p){ p->print();}int main(){ Parent p; Parent*pfather = &p; Child c; Parent* pson = reinterpret_cast
(&c); Parent* p = pson; // p也具备多态性 how_to_print(pfather); how_to_print(pson); how_to_print(p); pson_2 = pfather; how_to_print(p); return 0;}

现象:p具备多态性

小结: 指向子类对象的父类指针被传递后,依然具备多态性。

 

2.  探索爷爷类的多态

实验一:

爷爷类(父类的父类)是抽象类,看能否在孙类(子类的子类)身上,实现一个方法(成员函数)的多态调用。

#include 
#include
using namespace std;class Parent{public: virtual void print() = 0;};#if 0 // 方式1class Child : public Parent{public: virtual void print() = 0;};#else // 方式2class Child : public Parent{public: void print() { cout << "Child: print()" << endl; }};#endifclass GrandSon : public Child{ string name;public: GrandSon(char* n_name) { name = string(n_name); } void print() { cout << "GrandSon::print() :" << name << endl; }};void how_to_print(Parent* p){ p->print();}int main(){ GrandSon gson1("jason"); how_to_print(reinterpret_cast
(&gson1)); Parent* pgson1 = reinterpret_cast
(&gson1); cout << endl; GrandSon gson2("polly"); Parent* pgson2 = reinterpret_cast
(&gson2); how_to_print(pgson2); cout << endl; // 下面是拓展实验 Parent* gson_current = pgson1; how_to_print(gson_current); return 0;}

小结: 爷爷类(父类的父类)是抽象类时,中间层的父类是抽象类也罢,或者实现了自己的多态方法也罢,此时, 当爷爷类指针指向孙类对象,依然具备多态特性。

 

实验二:

爷爷类(父类的父类)是非抽象类,看能否在孙类(子类的子类)身上,实现一个方法(成员函数)的多态调用。

#include 
#include
using namespace std;class Parent{public: virtual void print() { cout << "Parent:: print()" << endl; }};class Child : public Parent{public: void print() { cout << "Child:: print()" << endl; }};class GrandSon : public Child{ string name;public: GrandSon(char* n_name) { name = string(n_name); } void print() { cout << "GrandSon::print() :" << name << endl; }};void how_to_print(Parent* p){ p->print();}int main(){ GrandSon gson1("jason"); how_to_print(reinterpret_cast
(&gson1)); Parent* pgson1 = reinterpret_cast
(&gson1); cout << endl; GrandSon gson2("polly"); Parent* pgson2 = reinterpret_cast
(&gson2); how_to_print(pgson2); cout << endl; // 下面是拓展实验 Parent* gson_current = pgson1; how_to_print(gson_current); return 0;}

爷爷类是非抽象类,实现了自己的virtual的方法A,且父类也实现了自己的virtual的方法A,且子类也实现了自己的virtual的方法A, 此时, 当爷爷类指针指向孙类对象,依然具备多态特性。 

 

最终结论:

只要调用的成员函数自从爷爷类开始就是virtual修饰的,使用爷爷类的指针指向孙类对象时,就支持多态调用。 

如果你需要一个精简版理解,那么你只需要理解:

多态调用的精髓在于使用了virtual关键字。

 

 

 

.

转载地址:http://irxuz.baihongyu.com/

你可能感兴趣的文章
我的价值观
查看>>
一文详解 Java 并发模型
查看>>
值类型与引用类型(中)
查看>>
MSSQL 2005 数据库变成可疑状态
查看>>
QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
查看>>
秋色园引发CPU百分百命案的事件分析与总结
查看>>
安装jdk并配置环境变量
查看>>
稀疏数组
查看>>
js的严格模式
查看>>
idea的安装和无限期试用
查看>>
Oracle VM VirtualBox安装PVE虚拟机
查看>>
【转】如何用css限制文字长度,使溢出的内容用省略号…显示
查看>>
Android MediaPlayer setDataSource failed
查看>>
[Vue 牛刀小试]:第十二章 - 使用 Vue Router 实现 Vue 中的前端路由控制
查看>>
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
查看>>
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
查看>>
大前端的自动化工厂(1)——Yeoman
查看>>
数据仓库建模方法论
查看>>
虚拟机搭建hadoop环境
查看>>
DataStax Bulk Loader教程(四)
查看>>