【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; }