C++中对C的扩展学习新增内容———面向对象(继承)函数扩展性及虚函数机制
1、c语言中的多态,动态绑定和静态绑定
void do_speak(void(*speak)())
{
speak();
} void pig_speak()
{
cout << "猪叫..." << endl;
} void cat_speak()
{
cout << "猫叫..." << endl;
} void test01()
{
do_speak(cat_speak);
}
C++中的多态:
class Animal
{
public:
// 虚函数
virtual void speak()
{
cout << "动物在叫唤..." << endl;
} void func()
{ }
}; class Cat : public Animal
{
public:
Cat(string name)
{
m_name = name;
} void speak()
{
cout << m_name << " 在叫唤..." << endl;
} void func()
{ }
public:
string m_name;
}; class Dog : public Animal
{
public:
Dog(string name)
{
m_name = name;
} void speak()
{
cout << m_name << " 在汪汪..." << endl;
} void func()
{ }
public:
string m_name;
}; class Pig : public Animal
{
public:
void speak()
{
cout << " 猪在叫..." << endl;
}
};
1、静态绑定
(1) 编译器会根据指针类型、引用类型来确定函数调用。
(2) 如果要实现根据传递不同对象,调用不同对象的speak,就要进行动态绑定。
2、动态绑定
(1) 根据引用或者指针,实际指向的类型来确定函数调用。
(2) 虚函数机制可以让编译器实现动态绑定。
3、实现多态的条件
(1) 表现形式:父类指针或者引用指向子类对象。
(2) 父类必须要有虚函数。
(3) 子类必须重写父类的虚函数,如果不重写,默认调用的父类函数。
(4) 父类纸质恩、或者引用指向子类对象。
虚函数的机制:
1、如果类的内部包含了虚函数,编译器首先会在类中安插虚函数表指针vfptr,vfptr指向一张表,这张表中存储的类中所有的虚函数入口地址。
2、当子类继承了父类,会将父类的虚函数表指针继承下来。一开始该虚函数指针指向父类的虚函数表,在子类中的构造函数中,编译器将其重新指向到了子类自己的虚函数表。
3、当子类重写了父类的虚函数,在虚函数表中会用子类的虚函数地址去覆盖父类对应虚函数的函数地址。
4、当通过父类指针、引用调用函数时,编译器会先找到该对象中隐藏存储的vfptr指针,根据虚函数指针找到虚函数表,在虚函数表中找到对应的函数入口地址,进行执行。
虚函数代码实现:
class Animal
{
public:
// 虚函数
virtual void speak()
{
cout << "动物在叫唤..." << endl;
} void func()
{ }
}; class Cat : public Animal
{
public:
Cat(string name)
{
m_name = name;
} void speak()
{
cout << m_name << " 在叫唤..." << endl;
} void func()
{ }
public:
string m_name;
}; class Dog : public Animal
{
public:
Dog(string name)
{
m_name = name;
} void speak()
{
cout << m_name << " 在汪汪..." << endl;
} void func()
{ }
public:
string m_name;
}; class Pig : public Animal
{
public:
void speak()
{
cout << " 猪在叫..." << endl;
}
};
C++中对C的扩展学习新增内容———面向对象(继承)函数扩展性及虚函数机制的更多相关文章
- C++中对C的扩展学习新增内容———面向对象(封装)
面向对象(封装) 1.对封装的理解: 1.封装就是把变量和函数放在一起统一表示某一个食物. class 2.给类内部的成员增加访问控制权限. 3.封装的语法就是class定义一个类. 2.给对象成员增 ...
- C++中对C的扩展学习新增语法——内联函数以及函数参数
内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个c ...
- C++中对C的扩展学习新增语法——动态内存管理
1.C语言动态内存管理的缺点: 1.malloc对象的大小需要自己计算. 2.需要手动转换指针类型. 3.C++的对象不适合使用malloc和free. 2.C++中new/delete基本使用: 3 ...
- C++中对C的扩展学习新增语法——强枚举
枚举类型 C++中对枚举的加强: 1.C++不允许非枚举值赋值给枚举类型,不允许其他枚举类型的值赋值给当前枚举类型,而C语言中是允许的. 2.枚举值具有外层作用域,容易造成名字冲突. 3.不同类型的枚 ...
- C++中对C的扩展学习新增语法——引用
引用 引用的好处: 1.引用的好处 C++使用结构体,不需要再使用 typedef. 2.值传递是将实参进行拷贝,赋值给形参,如果对象比较大,每次拷贝效率比较低,并且函数内部无法修改外部变量的值,能力 ...
- C++中对C的扩展学习新增语法——const
Const Const在C语言和C++语言中连接属性不一样,C语言默认是外部连接,如果需要内部连接,需要显示写上static.而在C++中默认是内部连接,如果希望其编程外部变量,需要显示写上exte ...
- C++中对C的扩展学习新增语法——强制类型转换
类型转换:主要进行指针类型转换,因为在C++中,不同类型指针不允许隐式转换,任何一个程序中如果出现了大量的类型转换,说明该程序不是太好的程序. 注意事项: 不同类型指针不允许隐式转换: void* 类 ...
- C++中对C的扩展学习新增语法——namespace
NAMESPACE语法 namespace主要解决了命名冲突的问题,语法如下 Namespace注意事项: namespace中可以定义常量.变量.函数.结构体.枚举.类等. namespace 只能 ...
- C++中对C的扩展学习新增语法——函数重载
函数重载 1.函数重载语法 1.同一个作用域(全局作用域.命名空间作用域.类作用域) 2.参数个数不同 3.参数类型不同 4.参数顺序不同 代码实现: 当函数名字一样的时候,通过参数类型.参数个数.参 ...
随机推荐
- luogu P3380 【模板】二逼平衡树(分块实现)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询 \(k\) 在区间内的排名 查询区间内排名为 \(k\) 的值 修改某一位值上的数值 查询 \(k\ ...
- [BZOJ3813] 奇数国 - 线段树
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 912 Solved: 508[Submit][Status][Discuss] ...
- Ubuntu 安装mysql & 自定义数据存储目录
一.安装 apt-get install mysql-server 执行过程如下: root@duke:~# apt-get install mysql-server 正在读取软件包列表... 完成 ...
- MacOS访达增强工具-TotalFinder
TotalFinder 是Mac上最好用的Finder增强工具,TotalFinder 提供了多标签式浏览.拷贝路径.剪切文件.显示隐藏文件.双栏窗口模式.彩色标签等功能 彩色的标签 将彩色带回El ...
- spring-boot-dependencies、spring-boot-starter-parent、io.spring.platform详解
上一篇文章介绍了springboot依赖版本号管理的几种方式,现在来详细分析一下spring-boot-dependencies.spring-boot-starter-parent.io.sprin ...
- cmake::编译一个工程
1.编译工程,构建过程产生的临时文件等文件与源码隔离,避免源码被污染. # CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 项目信息 proj ...
- javascript学习总结之对象的深拷贝和浅拷贝
前言 最近在写ES6的文章的时候发现重复遇到关于javascript深拷贝和浅拷贝的问题,然后查找了一些资料,根据资料和自己的理解做了以下笔记,毕竟javascript关于深拷贝和浅拷贝的问题在一些面 ...
- <Machine Learning - 李宏毅> 学习笔记
<Machine Learning - 李宏毅> 学习笔记 b站视频地址:李宏毅2019国语 第一章 机器学习介绍 Hand crafted rules Machine learning ...
- 什么是Viewport
什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机 ...
- Linux杂谈:解决配置静态ip后eth0网卡启动不了的问题
今天在看imooc上的<Linux网络管理>的课程中,在做一些实验时修改了下网络配置,发现了一些问题,就是保存网络配置后eth0网卡打不开,可能也会有很多人出现这类问题,我就在这里分享下自 ...