#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;
}
静动态类型与静态绑定,动态绑定
最新推荐文章于 2024-08-16 08:17:29 发布