C++的函数调用默认不使用动态绑定。要触发动态绑定,必须满足两个条件:

  1. 只有指定为虚函数的成员函数才能进行动态绑定
  2. 必须通过基类类型的引用或指针进行函数调用

因为每个派生类对象中都拥有基类部分,所以可以使用基类类型的指针或引用来引用派生类对象

示例

#include <iostream>
#include <string>
using namespace std; struct base
{
base(string str = "Base") : basename(str) {}
virtual void print() { cout << basename << endl; }
private:
string basename;
};
struct derived : public base
{
derived(string str = "Derived") : derivedname(str) {}
void print() { cout << derivedname << endl; }
private:
string derivedname;
}; int main()
{
base b;
derived d;
cout << "b.print(), d.print()" << endl;
b.print();
d.print(); base *pb = &b;
base *pd = &d;
cout << "pb->print(), pd->print()" << endl;
pb->print();
pd->print(); base &yb = b;
base &yd = d;
cout << "yb.print(), yd.print()" << endl;
yb.print();
yd.print();
}

结果

 分析

可以看出基类类型的指针或引用来引用派生类对象时,调用的是重定义的虚函数。要想覆盖虚函数机制,调用基函数的版本,可以使用强制措施。例:

代码

#include <iostream>
#include <string>
using namespace std; struct base
{
base(string str = "Base") : basename(str) {}
virtual void print() { cout << basename << endl; }
private:
string basename;
};
struct derived : public base
{
derived(string str = "Derived") : derivedname(str) {}
void print() { cout << derivedname << endl; }
private:
string derivedname;
}; int main()
{
base b;
derived d;
cout << "b.print(), d.print()" << endl;
b.print();
d.base::print(); base *pb = &b;
base *pd = &d;
cout << "pb->print(), pd->print()" << endl;
pb->print();
pd->base::print(); base &yb = b;
base &yd = d;
cout << "yb.print(), yd.print()" << endl;
yb.print();
yd.base::print();
}

结果

【c++】动态绑定的更多相关文章

  1. .Net mvc 根据前台参数动态绑定对象

    业务需求:根据前台界面的参数,动态绑定对象 <param name="colNames">属性名拼接字符串</param><param name=&q ...

  2. Java的动态绑定机制

    Java的动态绑定又称为运行时绑定.意思就是说,程序会在运行的时候自动选择调用哪儿个方法. 一.动态绑定的过程: 例子: public class Son extends Father Son son ...

  3. java动态绑定的一点注意

    动态绑定只是针对对象的方法,对于属性无效.因为属性不能被重写. show me code: public class Father{ public String name = "父亲属性&q ...

  4. Vue.js 动态绑定class

    Vue.js 的核心是一个响应的数据绑定系统,它允许我们在普通 HTML 模板中使用特殊的语法将 DOM “绑定”到底层数据.被绑定的DOM 将与数据保持同步,每当数据有改动,相应的DOM视图也会更新 ...

  5. 动态绑定HTML

    在Web前端开发中,我们经常会遇见需要动态的将一些来自后端或者是动态拼接的HTML字符串绑定到页面DOM显示,特别是在内容管理系统(CMS:是Content Management System的缩写) ...

  6. OC 动态类型,动态绑定,动态加载

    OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...

  7. 深入理解OOP(三):多态和继承(动态绑定和运行时多态)

    在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...

  8. Silverlight TreeView 动态绑定Xml 文件

      随着应用程序的不断升级,客户的需求不断增多,程序员不得不对自己的应用程序做出相应的修改,如果修改的内容较多,那么就必须找出一种简便方法,下面就为大家介绍一下在SilverLight 中左边导航栏T ...

  9. 深入理解C++的动态绑定和静态绑定【转】

    转自:http://blog.csdn.net/chgaowei/article/details/6427731 为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性 ...

  10. 将事件绑定在html标签中和js动态绑定的区别

    一:绑定在标签中: 能够一眼看出那些元素绑定了什么事件. 只能将元素和事件逐一实现绑定. 二js动态绑定: 可以一次动态的给多个元素绑定事件,批量绑定事件. html标签绑定的缺点: ①:可能有时间差 ...

随机推荐

  1. 一个简单的C#+arcgis的非数据库版例子

    1.首先新建一个winform的项目. 2.确保C#工具箱包含ESRI的相关控件,如果没有就需要安装SDK. 如果VS中依旧不存在esri控件解决方案如下,以VS2013为例: (1)打开注册表,定位 ...

  2. python学习之路 二 :基本数据类型

    本节重点 理解什么是变量? 掌握各种数据类型 理解可变类型和不可变类型 一.变量和常量 变量: 作用:存贮程序的中间结果在内存里,以备后边的程序调用 定义规范: 变量名只能是 字母.数字活下划线的任意 ...

  3. System.Data.OracleClient.dll方式操作oracle数据库

    System.Data.OracleClient.dll方式操作oracle数据库 一.查询语句: using (OracleConnection conn = new OracleConnectio ...

  4. mongodb 连接字符串

    mongodb 连接字符串 <!--连接字符串--> <add key="ts.students" value="mongodb://192.168.0 ...

  5. 清北学堂2019NOIP提高储备营DAY3

    今天是钟神讲课,讲台上照旧摆满了冰红茶 目录时间到: $1. 动态规划 $2. 数位dp $3. 树形dp $4. 区间dp $5. 状压dp $6. 其它dp $1. 动态规划: ·以斐波那契数列为 ...

  6. OCP 12c最新考试题库及答案(071-2)

    2019-02-12 16:23:54   2.(4-7) choose the best answer:You need to display the first names of all cust ...

  7. css3动画(animation)效果1-漂浮的白云

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. jmeter聚合报告详解

    聚合报告(aggregate report) 对于每个请求,它统计响应信息并提供请求数,平均值,最大,最小值,错误率,大约吞吐量(以请求数/秒为单位)和以kb/秒为单位的吞吐量. 吞吐量是以取样目标点 ...

  9. nginx高性能WEB服务器系列之九--nginx运维故障日常解决方案

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  10. POJ1475 Pushing Boxes(双搜索)

    POJ1475 Pushing Boxes  推箱子,#表示墙,B表示箱子的起点,T表示箱子的目标位置,S表示人的起点 本题没有 Special Judge,多解时,先最小化箱子被推动的次数,再最小化 ...