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 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...
随机推荐
- 又抓了一个导致频繁GC的鬼--数组动态扩容
概述 本周有个同事过来咨询一个比较诡异的gc问题,大概现象是,系统一直在做cms gc,但是老生代一直不降下去,但是执行一次jmap -histo:live之后,也就是主动触发一次full gc之后, ...
- 非静态代码块(非static初始化块)&静态代码块(static初始化块)
非静态代码块: TestOrder: package com.aff.singleton; /* 类的第四个成员:初始化块(代码块) 代码块: 如果有修饰的话只能使用static 分类:非静态代码块: ...
- 善意的投票&小M的作物 题解
善意的投票: 因为只有\(2\)种意愿,不妨让想睡午觉的和源点连边,让不想睡午觉的和汇点连边.对于每一对好朋友,在他们之间连边.那么只要源点和汇点还联通,就存在一对好友是冲突的,我们现在要做的就是删去 ...
- IT笑话十则(一)
一.下班前发给你 客户:“这个图下班之前必须发给我!” 设计师:“好的!” 第二天清早. 客户:“图怎么还没发过来?” 设计师:“我还没下班呢…” 二.受伤的老三 行业老大与老二PK,受伤的并非对 ...
- & vue项目中的rem适配
有个朋友问我在vue项目怎么做rem适配,我工作中都是用的dva,但是我感觉道理都是一样的,换汤不换药.配完就顺手写下来吧! 需要安装两个插件库 lib-flexible和px2rem-loader ...
- Parrot os安装docker及docker-compose
一.安装docker 1.添加Docker pgp key curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key ...
- Rocket - debug - Custom
https://mp.weixin.qq.com/s/jkBP6ZjEbgm-SVDpLUMjlA 简单介绍Custom的实现. 1. DebugCustomParams 包含两个参数: a. add ...
- Java实现 蓝桥杯VIP 算法提高 种树
算法提高 种树 时间限制:1.0s 内存限制:256.0MB 种树 问题描述 A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门 得到指令后,初步规划出n个 ...
- Java实现 LeetCode 107 二叉树的层次遍历 II(二)
107. 二叉树的层次遍历 II 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null, ...
- java实现第七届蓝桥杯剪邮票
剪邮票 题目描述 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所 ...