首页 > 其他分享 >静态绑定,动态绑定,静态类型,动态类型

静态绑定,动态绑定,静态类型,动态类型

时间:2023-04-12 21:13:43浏览次数:32  
标签:静态 绑定 virtual func 类型 动态

  • 静态类型:对象在声明时采用的类型,在编译期既已确定;
  • 动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的;
  • 静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期;
  • 动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期;
#include <iostream>
using namespace std;

class A
{
public:
    /*virtual*/ void func() { std::cout << "A::func()\n"; }
};
class B : public A
{
public:
    void func() { std::cout << "B::func()\n"; }
};
class C : public A
{
public:
    void func() { std::cout << "C::func()\n"; }
};
int main()
{
    C* pc = new C(); //pc的静态类型是它声明的类型C*,动态类型也是C*;
    B* pb = new B(); //pb的静态类型和动态类型也都是B*;
    A* pa = pc;      //pa的静态类型是它声明的类型A*,动态类型是pa所指向的对象pc的类型C*;
    pa = pb;         //pa的动态类型可以更改,现在它的动态类型是B*,但其静态类型仍是声明时候的A*;
    C *pnull = NULL; //pnull的静态类型是它声明的类型C*,没有动态类型,因为它指向了NULL;
    
    pa->func();      //A::func() pa的静态类型永远都是A*,不管其指向的是哪个子类,都是直接调用A::func();
    pc->func();      //C::func() pc的动、静态类型都是C*,因此调用C::func();
    pnull->func();   //C::func() 不用奇怪为什么空指针也可以调用函数,因为这在编译期就确定了,和指针空不空没关系;
    return 0;
}
//如果将A类中的virtual注释去掉,则运行结果是:
pa->func(); //B::func() 因为有了virtual虚函数特性,pa的动态类型指向B*,因此先在B中查找,找到后直接调用; pc->func(); //C::func() pc的动、静态类型都是C*,因此也是先在C中查找; pnull->func(); //空指针异常,因为是func是virtual函数,因此对func的调用只能等到运行期才能确定,然后才发现pnull是空指针;

 

转载文章:https://interviewguide.cn/notes/03-hunting_job/02-interview/01-01-04-basic.html

标签:静态,绑定,virtual,func,类型,动态
From: https://www.cnblogs.com/Explosion556/p/17311249.html

相关文章

  • 7663: 股票买卖 动态规划/线性dp
    描述 最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股票买卖问题。假设阿福已经准确预测出了某只股票在未来N天的价格,他希望买卖两次,使得获得的利润最高。为了计算简单起见,利润的计算方式为卖出的价格减去买入的......
  • 7662: 大盗阿福 01背包/动态规划
    描述 阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。这条街上一共有 N家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。作为一向谨慎作案的大盗,阿福不愿意冒着被......
  • 7659: 计算字符串距离 动态规划
    描述 对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:   修改一个字符(如把“a”替换为“b”);删除一个字符(如把“traveling”变为“travelng”)。比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的......
  • 5752: 最长公共子序列 动态规划
    描述 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1,x2,…,xm>,则另一序列Z=<z1,z2,…,zk>是X的子序列是指存在一个严格递增的下标序列<i1,i2,…,ik>,使得对于所有j=1,2,…,k有:  Xij=Zj例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子......
  • 什么是移动端动态化?
    在移动开发领域,为了让APP保持最新的版本,同时让业务开发变得更加快捷,动态化技术极其重要。今天就来聊聊移动端动态和开发的由来和各流派的优缺点。移动端动态化的由来“动态化”并不是最近几年才产生的名词,而是从从互联网诞生的初期,这个词就已经出现了。大家所认知的早期互联网,其实......
  • thymeleaf 动态添加class样式
    根据后台所返回的数据动态调整样式1、th:class<labelth:class="${t.isRequired}==1?'col-sm-3control-labelis-required':'col-sm-3control-label'"th:text="${t.fieldTitle}+':'"></label>2、th:classappend&l......
  • BLE配对与绑定三
    前言:针对HID设备配对绑定获取信息常用代码做汇总。一、获取主机MAC地址需先绑定以获取固定MAC地址{gapBondRec_tbond_info;uint8_tadv_event_type=GAP_ADTYPE_ADV_HDC_DIRECT_IND;uint8_tAdv_Direct_Addr[B_ADDR_LEN];uint8_tAdv_Direct_Type=ad......
  • 参展动态 | 璞华受邀出席第七届电气化交通前沿技术论坛&展会
     第七届电气化交通前沿技术论坛 4月6日至8日,第七届电气化交通前沿技术论坛在武汉举行。该论坛是国内首个专注电气化交通领域的跨学科、交叉型、开放型论坛,由中国电源学会交通电气化专委会主办,中国船舶集团第七一二研究所、清华大学、中车株洲电力机车研究所联合承办。陈清泉......
  • Linux系统中设置网络为动态IP地址过程
    Linux系统中设置网络为动态IP地址过程1.启动安装好的Linux,并使用root登陆2.在节面中输入”ifconfig”命令,判断网卡是否启动3如果没有启动,输入“netconfig”命令,启动网络配置向导4选择Yes,进入配置界面,选择使用动态IP地址5.点击OK,退出网卡配置页面6.输入命令cd/etc/sysc......
  • Android动态设置drawableRight
    DrawablerightDrawable=getResources().getDrawable(R.drawable.icon);//调用setCompoundDrawables时,必须调用Drawable.setBounds()方法,否则图片不显示rightDrawable.setBounds(0,0,rightDrawable.getMinimumWidth(),rightDrawable.getMinimumHeight());//left,top,r......