动态联编和静态联编
动态联编条件:虚函数 + 基类指针/引用
静态联编条件:重载
动态联编代码
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;
}