首页 编程 软件学院 查看内容

你从未见过的编程题——模板类的实例化继承

2017-4-17 17:08 |来自: 互联网 3593 0

摘要: 关注“爱当程序员的我”,每天都有关于编程头条发布本文涉及到了C++中的模板类、继承、操作符重载等知识点。编译工具:Visual Studio 2015开门见山,小编先阐述一下题意:实现一个模板类Comparable,要求根据如下子 ...

关注“爱当程序员的我”,每天都有关于编程头条发布


本文涉及到了C++中的模板类、继承、操作符重载等知识点。

编译工具:Visual Studio 2015

开门见山,小编先阐述一下题意:实现一个模板类Comparable,要求根据如下子类Height和Weight中重载的“<”操作符,能够实现调用两子类对象比较“>”、“≥”、“≤”、“==”和“!=”操作符。

模板类代码框架如下:

template

struct Comparable

{

// 代码实现

};

两子类代码(不可更改)如下:

图1 两结构体Height和Weight

如上,大家可以理解题意了嘛?如果还是不可以,我们再看一下主函数(不可更改):

图2 主函数

如上,我们需要在Comparable模板类中实现一些操作符重载函数,以保证子类Height和Weight能够调用该操作符,而我们所拥有的只有子类中的“<”操作符。完成这个编程题我们需要考虑以下问题:

  1. 在比较时,父类Comparable并不能取到子类的value值,那么便只能通过调用子类的“<”函数变形得到其他操作符。

  2. 那么如何用仅有的“<”操作符实现“>”、“≥”、“≤”、“==”和“!=”操作符?

  3. 又如何操作,使得this指针指向的对象能够与操作符右边的对象一起调用到子类的“<”操作符?

图3 继承结构分析

接下来我们首先解决第一个问题,分析如下(也可直接看图4):

  1. 现在可以判断ab的判断,我们可以将两个对象翻转去调用“<”操作符;

  2. 从数学角度,“≥”即为“<”的结果取反,我们将两对象调用“<”操作符的结果取反即得到“≥”;

  3. 同上,“≤”即为“>”的结果取反,即可得到;

  4. 同样的从数学角度,a==b相当于a不大于b的同时b也不大于a,即为(!(ab));

  5. 同理,a!=b相当于(a

图4 逻辑详解

第一个问题很简单,那么第二个问题要如何解决呢?

  1. 首先,Height/Weight中的代码是不可更改的,故而要调用其他操作符必然要调用到Comparable中去;

  2. Comparable中可以调用模板参数Derived中“<”操作符重载函数,但是需要合适的对象

那么我们是否可以将this指针强制类型转换成Derived*类型去调用“<”操作符呢?

图5 最终代码

代码如上,大家认为小编的代码编译可以通过嘛?运行结果又如何呢?

图6 运行结果

事实证明,this指针可以强制类型转换成模板参数的对象。(其他操作符逻辑已分析过,可参照图4)


结束语:

如果喜欢这篇头条,一定要收藏哟^O^

点击关注,了解更多关于编程的知识^O^

如果有不懂的地方,可以留言,相互探讨,相互学习,共同进步^O^

本文出处: http://www.toutiao.com/a6409871089518100738/
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部