C++编译期多态与运行期多态
C语言与CPP编程
共 3284字,需浏览 7分钟
· 2021-08-06
来源:https://www.cnblogs.com/QG-whz/p/5132745.html
前言
什么是运行期多态 什么是编译期多态 它们的优缺点在哪
运行期多态
class Animal
{
public :
virtual void shout() = 0;
};
class Dog :public Animal
{
public:
virtual void shout(){ cout << "汪汪!"<<endl; }
};
class Cat :public Animal
{
public:
virtual void shout(){ cout << "喵喵~"<<endl; }
};
class Bird : public Animal
{
public:
virtual void shout(){ cout << "叽喳!"<<endl; }
};
int main()
{
Animal * anim1 = new Dog;
Animal * anim2 = new Cat;
Animal * anim3 = new Bird;
//藉由指针(或引用)调用的接口,在运行期确定指针(或引用)所指对象的真正类型,调用该类型对应的接口
anim1->shout();
anim2->shout();
anim3->shout();
//delete 对象
...
return 0;
}
//我们有个动物园,里面有一堆动物
int main()
{
vector<Animal*>anims;
Animal * anim1 = new Dog;
Animal * anim2 = new Cat;
Animal * anim3 = new Bird;
Animal * anim4 = new Dog;
Animal * anim5 = new Cat;
Animal * anim6 = new Bird;
//处理异质类集合
anims.push_back(anim1);
anims.push_back(anim2);
anims.push_back(anim3);
anims.push_back(anim4);
anims.push_back(anim5);
anims.push_back(anim6);
for (auto & i : anims)
{
i->shout();
}
//delete对象
//...
return 0;
}
编译期多态
相比较于运行期多态,实现编译期多态的类之间并不需要成为一个继承体系,它们之间可以没有什么关系,但约束是它们都有相同的隐式接口。我们将上面的例子改写为:
class Animal
{
public :
void shout() { cout << "发出动物的叫声" << endl; };
};
class Dog
{
public:
void shout(){ cout << "汪汪!"<<endl; }
};
class Cat
{
public:
void shout(){ cout << "喵喵~"<<endl; }
};
class Bird
{
public:
void shout(){ cout << "叽喳!"<<endl; }
};
template <typename T>
void animalShout(T & t)
{
t.shout();
}
int main()
{
Animal anim;
Dog dog;
Cat cat;
Bird bird;
animalShout(anim);
animalShout(dog);
animalShout(cat);
animalShout(bird);
getchar();
}
运行期多态与编译期多态优缺点分析
运行期多态优点
OO设计中重要的特性,对客观世界直觉认识。 能够处理同一个继承体系下的异质类集合。
运行期多态缺点
运行期间进行虚函数绑定,提高了程序运行开销。 庞大的类继承层次,对接口的修改易影响类继承层次。 由于虚函数在运行期在确定,所以编译器无法对虚函数进行优化。
编译期多态优点
它带来了泛型编程的概念,使得C++拥有泛型编程与STL这样的强大武器。 在编译器完成多态,提高运行期效率。 具有很强的适配性与松耦合性,对于特殊类型可由模板偏特化、全特化来处理。
编译期多态缺点
程序可读性降低,代码调试带来困难。 无法实现模板的分离编译,当工程很大时,编译时间不可小觑。 无法处理异质对象集合。
关于显式接口与隐式接口
void AnimalShot(Animal & anim)
{
anim.shout();
}
template <typename T>
void AnimalShot(T & anim)
{
anim.shout();
}
评论
一女子与一男子在阳台上打扑克,被邻居偷拍后...
近日网络上又发生了一起疑似黄色谣言的事件:一女子与一男子在阳台上打扑克,被邻居偷拍后上传到网上,引发广泛舆论讨论。根据网传视频显示,一名穿着吊带睡衣的女子与一名光着上身的男性在阳台上交谈,随后开始打起扑克牌。这一幕被邻居拍下并上传至网络后,引发了许多网友的关注和猜测,其中大部分涉及到了不当的假设。当
逆锋起笔
0
字节的跳动职级与薪资(2024年)
上一篇:阿里公布年终奖,P7, 3.5+,22W年终奖,还有35W长期现金激励,真香字节跳动自2012年3月成立以来,已经迅速成长为一个全球性的科技公司。其产品和服务已经遍布全球150多个国家与地区,并且支持超过75种不同的语言。在字节跳动的官方网站上,列出了一系列引人注目的产品和服务,包括但不限于
开发者全社区
0
管理世界2024 | 使用管理层讨论与分析测量「企业人工智能指标」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址 https://textdata.cn/blog/2024-04-19-ai-improve-firm-productivity/
大邓和他的Python
0
新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路
1、《一本书讲透 Elasticsearch》销售最近进展汇报给大家同步一下《一本书讲透 Elasticsearch》图书的进展情况,本周五(2024年4月26日),出版社编辑老师反馈图书相关销量进展:预计全网销量 1000 册+,发货量 2462 册(截止2024年4月28日)。2023年12月2
铭毅天下
0
IT 运维整体解决方案(PPT)
本文作为一个IT运维整体解决方案PPT,包括了步骤规划、平台设计、事件处理流程、监控、各设备及系统管理、工作流引擎等各个要素,对撰写运维方案具有参考价值,部分内容可作为模板借鉴。(*因成文时间所限,文中举例的部分产品技术可能过时,但产品技术并非本文重点。)图片点击可放大原题:IT运维整体解决方案,点
数据中心运维管理
0
国产算力训练大模型的经验与教训
本文来自“国产算力训练大模型的经验与教训”。本文介绍大模型的计算特征(国产平台介绍、系统挑战、算子实现、容错)、框架的并行性支持、未来算法等。随着ChatGPT的横空出世,人工智能大模型成为各行各业热议的焦点,国内外各种大模型如雨后春笋般涌现,引发了新一轮人工智能热潮。但在看到大模型取得巨大进步的同
架构师技术联盟
1
Java与lua互相调用简单教程
来源:网络👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目
小哈学Java
0
【送书福利】《Java面试八股文:高频面试题与求职攻略一本通》
先来唠唠最近粉丝面试回来跟我聊天,基本上都提到一个点,在面试过程中八股文占比很高(八股文70%、项目20%、10%算法)除了一些搞算法突出的厂除外。其实现在很多厂八股都是逐渐深入的方式来问,所以大家在学习的过程中,针对一些重点的内容,最好深入去学习,不然还是比较难应对这种追问式的问题。最近刚好从一位
Java后端技术
0