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的扩展学习新增内容———面向对象(继承)函数扩展性及虚函数机制的更多相关文章

  1. C++中对C的扩展学习新增内容———面向对象(封装)

    面向对象(封装) 1.对封装的理解: 1.封装就是把变量和函数放在一起统一表示某一个食物. class 2.给类内部的成员增加访问控制权限. 3.封装的语法就是class定义一个类. 2.给对象成员增 ...

  2. C++中对C的扩展学习新增语法——内联函数以及函数参数

    内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个c ...

  3. C++中对C的扩展学习新增语法——动态内存管理

    1.C语言动态内存管理的缺点: 1.malloc对象的大小需要自己计算. 2.需要手动转换指针类型. 3.C++的对象不适合使用malloc和free. 2.C++中new/delete基本使用: 3 ...

  4. C++中对C的扩展学习新增语法——强枚举

    枚举类型 C++中对枚举的加强: 1.C++不允许非枚举值赋值给枚举类型,不允许其他枚举类型的值赋值给当前枚举类型,而C语言中是允许的. 2.枚举值具有外层作用域,容易造成名字冲突. 3.不同类型的枚 ...

  5. C++中对C的扩展学习新增语法——引用

    引用 引用的好处: 1.引用的好处 C++使用结构体,不需要再使用 typedef. 2.值传递是将实参进行拷贝,赋值给形参,如果对象比较大,每次拷贝效率比较低,并且函数内部无法修改外部变量的值,能力 ...

  6. C++中对C的扩展学习新增语法——const

     Const Const在C语言和C++语言中连接属性不一样,C语言默认是外部连接,如果需要内部连接,需要显示写上static.而在C++中默认是内部连接,如果希望其编程外部变量,需要显示写上exte ...

  7. C++中对C的扩展学习新增语法——强制类型转换

    类型转换:主要进行指针类型转换,因为在C++中,不同类型指针不允许隐式转换,任何一个程序中如果出现了大量的类型转换,说明该程序不是太好的程序. 注意事项: 不同类型指针不允许隐式转换: void* 类 ...

  8. C++中对C的扩展学习新增语法——namespace

    NAMESPACE语法 namespace主要解决了命名冲突的问题,语法如下 Namespace注意事项: namespace中可以定义常量.变量.函数.结构体.枚举.类等. namespace 只能 ...

  9. C++中对C的扩展学习新增语法——函数重载

    函数重载 1.函数重载语法 1.同一个作用域(全局作用域.命名空间作用域.类作用域) 2.参数个数不同 3.参数类型不同 4.参数顺序不同 代码实现: 当函数名字一样的时候,通过参数类型.参数个数.参 ...

随机推荐

  1. [LUOGU3413] SAC#1 - 萌数

    题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数 ...

  2. 【原】centos上安装newman

    1.安装node/npm 1.Newman(因为Newman是node编写,需要依赖nodejs):可以使用先下载安装包到 /usr/local路径下 /usr/local# wget https:/ ...

  3. ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  4. 图片放大缩小插件 zoom.js 怎么用

    代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...

  5. 云计算 docker 容器部署

    什么是docker容器: 容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出.隔离的环境拥有自己的系统文件,ip地址,主机名等kvm虚拟机,linux,系统文件 容器和虚拟化的区别 : ...

  6. 百万年薪python之路 -- 并发编程之 多进程二

    1. 僵尸进程和孤儿进程 基于unix的环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻检测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收. ...

  7. 函数进阶(三) day14

    目录 昨日内容 迭代器 可迭代对象 迭代器对象 for循环原理 三元表达式 列表推导式 字典生成式 zip 生成器表达式 生成器 yield 递归 今日内容 匿名函数 内置方法 掌握 了解 异常处理 ...

  8. 存储路径与文件目录操作ZT

    转自:https://www.cnblogs.com/zrr-notes/p/5953445.html (一)基本存储位置 我们的app在手机中存放的路径是:/var/mobile/Applicati ...

  9. marquee滚动标签

    marquee语法    <marquee></marquee> 实例一<marquee>Hello, World</marquee> marquee常 ...

  10. 针对工程实践项目的用例建模Use Case Modeling

    一.什么是用例建模(Use Case Modeling) 1.用例(Use Case) (1)概念:用例是软件工程或系统工程中对系统如何反应外界请求的描述,是一种通过用户的使用场景来获取需求的技术. ...