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

#include <iostream>
#ifdef _DEBUG   //只在Debug(调试)模式下
#ifndef DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符
#define new DEBUG_NEW
#endif
#endif
using namespace std;
#pragma warning(disable : 4996) 


class A
{
    
    
public:
	void fun()
	{
    
    
		std::cout << "A::fun" <<std::endl;
	}
	virtual void vfun()
	{
    
    
		std::cout << "A::vfun" << std::endl;
	}
	virtual void v1fun(int a=1)
	{
    
    
		std::cout << "A::v1fun" << std::endl;
		std::cout << a << std::endl;
	}
};

class B :public A
{
    
    
public:
	void fun()
	{
    
    
		std::cout << "B::fun" << std::endl;
	}
	virtual void vfun()
	{
    
    
		std::cout << "B::vfun" << std::endl;
	}
	virtual void v1fun(int a = 2)
	{
    
    
		std::cout << "B::v1fun" << std::endl;
		std::cout << a << std::endl;
	}
};



int main()
{
    
    
	B obj1; //静态类型是B,没有动态类型
	A &obj = obj1;  //静态类型是A,动态类型是B,当然动态类型可以改变
	A* p = new B;  //静态类型是A,动态类型是B
	//静态类型执行静态绑定,动态类型执行动态绑定,静态类型的的静态绑定发生在编译期间
	obj.fun();  //普通的成员函数执行的是静态绑定,所以这里调用的是A的fun
	p->fun();   //普通的成员函数执行的是静态绑定,所以这里调用的是A的fun
	p->vfun();  //虚函数执行的是动态绑定,所以这里调用的是B的fun
	p->v1fun(); //函数默认参数执行的是静态绑定,所以输出的a是父类A里面的a=1,
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38158479/article/details/119978980