C++中的动态绑定

摘要:
C++中的基类和派生类遵循类型兼容的原则:即派生类的对象可以用来初始化基类的对象,派生类的目标可以用来初始化该基类的引用,派生类对象的地址可以用来初始化基类对象的指针。C++中动态绑定条件的出现需要满足两个条件:1.只有指定为虚拟函数的成员函数才能动态绑定。默认情况下,成员函数是非虚拟函数,不能动态绑定非虚拟函数。2.必须通过基类类型的引用或指针调用函数。基类类型引用和指针的关键点是静态类型和动态类型可能不同:1.什么是静态类型?

C++中基类和派生类遵循类型兼容原则:即可用派生类的对象去初始化基类的对象,可用派生类的对象去初始化基类的引用,可用派生类对象的地址去初始化基类对象指针。

C++中动态绑定条件发生需要满足2个条件:

1:只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数,非虚函数不能进行动态绑定

2:必须通过基类类型的引用或指针进行函数调用

基类类型引用和指针的关键点在于静态类型和动态类型可能不同:

1:什么是静态类型?就我的理解来说,所谓的静态类型是指,当我们用上述引用或指针去调用非虚函数是,这时的引用和指针就是引种静态类型的,它对非虚函数的调用是在编译时就确定了

2:从静态类型的对立来看,所谓的动态类型也很明显,当这个引用或指针调用了虚函数时,它就是动态类型,它的行为要到程序运行时才能定义

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>

#define CL(arr, val) memset(arr, val, sizeof(arr))

#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d
", x)
#define lowbit(x)   (x)&(-x)
#define Read()  freopen("data.in", "r", stdin)
#define Write() freopen("d.out", "w", stdout)
#define ll unsigned long long


#define M 100007
#define N 100007

using namespace std;

const int inf = 0x7f7f7f7f;
const int mod = 1000000007;

const ll R = ((1uLL<<63) - 1);

class A
{
    public:
    A(){}
    virtual void test()
    {
         printf("form A's functuion1
");
    }
};
class B: public A
{
    public :
    B(){};
    void test()
    {
        printf("form B's functuion 2
");
    }
};
int main()
{
//    Read();
    B b;
    b.test();
    //用派生类的对象去初始化基类的对象
    A a = b;
    a.test();
    //用派生类对象的地址去初始化基类对象指针
    A *ta = new A;
    ta = &b;
    ta->test();
    //用派生类的对象去初始化基类的引用
    A &tta = b;
    tta.test();
    return 0;
}

  

运行以上程序我们会发现将用派生类的对象去初始化基类的对象时,没有存在动态绑定,而是直接调用了基累的函数。其实我们上边提到了,发生动态绑定的第二个条件已经说了,必须是基累的引用或者指针。如果用对象直接初始化的化会自动调用基类的复制构造函数或者重载的赋值操作符。进行截断处理把不属于基类的派生类中的部分去掉。

免责声明:文章转载自《C++中的动态绑定》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Springboot+WebSocket+Kafka(写着玩的)idea修改maven默认配置不生效下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

应用开发框架之——数据字典、原数据、模板

对象根据原数据动态生成,改变原数据,根据原数据动态生成的对象的属性也随之改变。 可以把原数据保存在数据表中,或者文件中。软件系统运行的时候读取这些原数据,然后动态地生成一些对象。 在管理软件里面,我们习惯性地叫数据字典。为此会专门设计一个数据字典的数据表来保存原数据。通过软件设置改变就是数据字典数据表里面的原数据。 模板,大概是c++的叫法。无论怎样,数据...

python 爬虫_PyQuery详细用法

总结:语法和JQuery一样 1. 初始化 from pyquery import PyQuery as pq #用pq代替pyquery doc=pq(html) print(doc('li')) #字符串的初始化 from pyquery import PyQuery as pq...

Golang 的 go mod 管理包

go 1.14.4 初始化项目 mod管理包   go mod init example    可能会报如下错误:  go mod init: modules disabled by GO111MODULE=off; see 'go help modules'   解决   set GO111MODULE=on //window 得用管理员才能更改  ...

SuperSocket源码解析之会话生命周期

一 基本概念    会话(Session)是客户端与服务器进行通信的基本单元,也是一个Socket的封装,在http协议中也有Session机制,其主要作用封装一个通信单元socket,负责服务器与客户端消息发送与接收,会话之间相互独立互不干扰且拥有唯一SessionId标识,维护着客户与服务器通信的生命周期。 二 SocketSession Socket...

再探NSString

再探NSString NSString应该是oc开发中最常用的一个数据类型了,这次对该类型再进行一次全方位的探索与总结。 NSString本质上属于OC类对象,继承于NSObject,遵守NSCopying, NSMutableCopying, NSSecureCoding协议。 NSMutableString与之类似,唯一不同的是它继承于NSStrin...

nm命令详解

前言 nm是name的缩写,它显示指定文件中的符号信息,文件可以是对象文件、可执行文件或对象文件库。如果文件中没有包含符号信息,nm报告该情况,单不把他解释为出错。nm缺省情况下报告十进制符号表示法下的数字值。 选项 -a/--debug-syms:显示所有符号,包括debugger-only symbols -B:等同于--format=bsd,兼容...