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 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...
随机推荐
- Map.Entry的作用
一般情况下,要输出Map中的key 和 value 是先得到key的集合,然后再迭代(循环)由每个key得到每个value 而Entry可以一次性获得这两个值 Set set = map.keySet ...
- C#基础之方法的重载
在C#语言中,方法的重载作用非常大,但是使用重载需要注意方法的签名,必须有一种要不一样,具体指的是: 1.方法的返回值类型 2.方法的形参类型 3.形参类型的顺序 4.形参的个数 4.泛型的类型< ...
- [PHP学习教程 - 系统]001.引用文件(require & include)
引用文件的方法有两种:require 及 include.两种方式提供不同的使用弹性. 1.require 的使用方法如 require("MyRequireFile.php"); ...
- PMP | 备考笔记
(持续更新......) 五大过程组和十大知识领域是PMP的重要组成部分,也是这门课的重点线索,本文会逐步迭代.渐进明细的来补充完善这个体系. (先放个图吧) 以下每个模块记录自己有点模糊的地方 项目 ...
- UPX的使用
UPX是一个通用可执行文件压缩器,由于其具有: 压缩率高:压缩效果优于zip/gzip: 解压速度快:在奔腾133上即可达到大约10MB/秒: 压缩的可执行文件没有额外的内存开销: 安全:可以列表,检 ...
- 数字电路建模 - jchdl
https://mp.weixin.qq.com/s/uWU6i30_q7wJT3yVJ8yqnQ jchdl:Jianchang Constructed Hardware Description ...
- Java 蓝桥杯 算法训练 貌似化学
** 貌似化学 ** 问题描述 现在有a,b,c三种原料,如果他们按x:y:z混合,就能产生一种神奇的物品d. 当然不一定只产生一份d,但a,b,c的最简比一定是x:y:z 现在给你3种可供选择的物品 ...
- Java实现 蓝桥杯 算法提高 01背包
算法提高 01背包 时间限制:1.0s 内存限制:256.0MB 问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入 ...
- Java实现 LeetCode 123 买卖股票的最佳时机 III(三)
123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与 ...
- java实现第四届蓝桥杯空白格式化
空白格式化 本次大赛采用了全自动机器测评系统. 如果你的答案与标准答案相差了一个空格,很可能无法得分,所以要加倍谨慎! 但也不必过于惊慌.因为在有些情况下,测评系统会把你的答案进行"空白格式 ...