【c++】动态联编和静态联编

动态联编和静态联编

动态联编条件:虚函数 + 基类指针/引用 静态联编条件:重载

动态联编代码

class A
{
          
   
public:
	virtual void print()
	{
          
   
		cout << "void printA()" << endl;
	}
protected:
	int a;
};

class B :public A
{
          
   
public:
	void print()
	{
          
   
		cout << "void printB()" << endl;
	}
protected:
	int a;
};
int main()
{
          
   
	A* pa = new B();
	pa->print();
	return 0;
}

在此例中使用了动态开辟出的B去初始化基类A的指针,同时调用了虚函数print(),那么就可以发生运行时多态,调用B的print()函数。 但是如果不加virtual,不会发生多态,仍然调用的是A自己的print()。

静态联编示例代码

class A
{
          
   
public:
	virtual void print()
	{
          
   
		cout << "void printA()" << endl;
	}
	void print(int n)
	{
          
   
		cout << "n = " << n << endl;
	}
protected:
	int a;
};

总结

print()发生函数重载,在编译时会进行代码的实例化,生成对应的真正的代码,如果在主函数中进行如下调用:

int main()
{
          
   
	A* pa = new B();
	pa->print();// 因为动态联编调用了B的print()
	pa->print(10);// 因为静态联编调用A中重载好的函数
	return 0;
}
经验分享 程序员 微信小程序 职场和发展