c++虚函数和虚继承
关键字virtual用于父类方法,如果传了一个子类对象,并且子类重写了父类的这个virtual方法,就会调用子类的方法。传谁就调用谁,这个就是多态。
#include<iostream>
using namespace std; class Biological{
public:
virtual void range(){
cout<<"widely"<<endl;
} void name(){
cout<<"biological"<<endl;
}
}; class Animal:public Biological{
public:
virtual void range(){
cout<<"medium"<<endl;
} void name(){
cout<<"animal"<<endl;
}
}; class Person:public Animal{
public:
virtual void range(){
cout<<"small"<<endl;
} void name(){
cout<<"person"<<endl;
}
}; void Display(Biological *p){
p->range();
p->name();
delete p;
} int main(){
Display(new Biological);
Display(new Animal);
Display(new Person);
return ;
}
#include<iostream>
using namespace std; class Biological{
public:
Biological(){
cout<<"Biological构造"<<endl;
} ~Biological(){
cout<<"Biological析构"<<endl;
}
}; class Animal:virtual public Biological{
public:
Animal(){
cout<<"Animal构造"<<endl;
} ~Animal(){
cout<<"Animal析构"<<endl;
}
}; class Plant:virtual public Biological{
public:
Plant(){
cout<<"Plant构造"<<endl;
} ~Plant(){
cout<<"Plant析构"<<endl;
}
}; class SeaAnemone:public Animal,public Plant{
public:
SeaAnemone(){
cout<<"SeaAnemone构造"<<endl;
} ~SeaAnemone(){
cout<<"SeaAnemone析构"<<endl;
}
}; int main(){
SeaAnemone sea_anemone;
return ;
}
#include<iostream>
using namespace std; class Biological{
public:
Biological(){
cout<<"Biological构造"<<endl;
} virtual ~Biological(){
cout<<"Biological析构"<<endl;
}
private:
char *name;
}; class Animal:virtual public Biological{
public:
Animal(){
cout<<"Animal构造"<<endl;
} ~Animal(){
cout<<"Animal析构"<<endl;
}
}; class Plant:virtual public Biological{
public:
Plant(){
cout<<"Plant构造"<<endl;
} ~Plant(){
cout<<"Plant析构"<<endl;
}
}; class SeaAnemone:public Animal,public Plant{
public:
SeaAnemone(){
cout<<"SeaAnemone构造"<<endl;
} ~SeaAnemone(){
cout<<"SeaAnemone析构"<<endl;
}
}; int main(){
Biological *sea_anemone = new SeaAnemone;
delete sea_anemone;
return ;
}
注意:如果将~Biological()函数前的virtual去掉那么函数会出错。
总结:我们一定要注意在基类的析构函数前面加上virtual,使其变成虚析构在C++程序中使用虚函数,虚继承和虚析构是很好的习惯 可以避免许多的问题。
c++虚函数和虚继承的更多相关文章
- C++ 子类继承父类纯虚函数、虚函数和普通函数的区别
C++三大特性:封装.继承.多态,今天给大家好好说说继承的奥妙 1.虚函数: C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现.子类可以重写父类的虚函数实现子类 ...
- virtual之虚函数,虚继承
当类中包含虚函数时,则该类每个对象中在内存分配中除去数据外还包含了一个虚函数表指针(vfptr),指向虚函数表(vftable),虚函数表中存放了该类包含的虚函数的地址. 当子类通过虚继承的方式从父类 ...
- 虚函数&纯虚函数&抽象类&虚继承
C++ 虚函数&纯虚函数&抽象类&接口&虚基类 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过 ...
- C++ 虚函数、纯虚函数、虚继承
1)C++利用虚函数来实现多态. 程序执行时的多态性通过虚函数体现,实现运行时多态性的机制称爲动态绑定:与编译时的多态性(通过函数重载.运算符重载体现,称爲静态绑定)相对应. 在成员函数的声明前加上v ...
- C++之虚函数与虚继承详解
准备工作 1.VS2012使用命令行选项查看对象的内存布局 微软的Visual Studio提供给用户显示C++对象在内存中的布局的选项:/d1reportSingleClassLayout.使用方法 ...
- C++ 由虚基类 虚继承 虚函数 到 虚函数表
//虚基类:一个类可以在一个类族中既被用作虚基类,也被用作非虚基类. class Base1{ public: Base1(){cout<<"Construct Base1!&q ...
- C++之易混淆知识点四---虚函数与虚继承
C++面向对象中,虚函数与虚继承是两个完全不同的概念. 一.虚函数 C++程序中只要类中含有虚拟函数,编译程序都会为此类生成一个对应的虚拟函数跳转表(vtbl),该虚拟函数跳转表是一个又若干个虚拟函数 ...
- [c++] C++多态(虚函数和虚继承)
转自:https://www.jianshu.com/p/02183498a2c2 面向对象的三大特性是封装.继承和多态.多态是非常重要的一个特性,C++多态基于虚函数和虚继承实现,本文将完整挖掘C+ ...
- c++内存分布之虚函数(多继承)
系列 c++内存分布之虚函数(单一继承) c++内存分布之虚函数(多继承) [本文] 结论 1.虚函数表指针 和 虚函数表 1.1 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...
随机推荐
- 引入mybatis-plus报 Invalid bound statement错误怎么办,动动手指改一个地方就行
错误 Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率.其实就是帮我们封装了一些简单的curd方法,可以直接调用,不必再 ...
- Docker部署nginx,tomcat,es,可视化
nginx [root@iz2zeaet7s13lfkc8r3e2kz /]# docker pull nginx #下载 Using default tag: latest latest: Pull ...
- 使用jQuery实现Ajax
jQuery对Ajax操作进行了封装,在jQuery中最底层的方法是$.ajax(), 第二层是load(), $.get(), $.post() 第三层是$.getScript(), $.g ...
- 离散数学 II(最全面的知识点汇总)
离散数学 II(知识点汇总) 目录 离散数学 II(知识点汇总) 代数系统 代数系统定义 例子 二元运算定义 运算及其性质 二元运算的性质 封闭性 可交换性 可结合性 可分配性 吸收律 等幂性 消去律 ...
- Chisel3 - Scala语言专家
https://mp.weixin.qq.com/s/j8mt_qvwliKIKtlN6JcyqQ 介绍Intellij IDEA安装Scala插件后,如何在阅读和编码两方面助益开发者. ...
- 看板 | 漫话之减少WIP(在制品)
传统的流水线生产模式中,生产流程按生产程序进行划分,而各部分因动作的难度或复杂程度的差异导致用时不同. 例如:一个产品进行组装用时2分钟,完成装箱工作只需10秒.在这种情况下,组装动作用时长.产出慢, ...
- ASP.NET生成验证码
首先,添加一个一般处理程序 注释很详细了,有不懂的欢迎评论 using System; using System.Collections.Generic; using System.Drawing; ...
- Java实现 LeetCode 404 左叶子之和
404. 左叶子之和 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 /** * Definiti ...
- Java实现 蓝桥杯VIP 算法训练 字符串逆序
问题描述 给定一个字符串,将这个串的所有字母逆序后输出. 输入格式 输入包含一个字符串,长度不超过100,字符串中不含空格. 输出格式 输出包含一个字符串,为上面字符串的逆序. 样例输入 tsinse ...
- Java实现 LeetCode 31下一个排列
31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...