C++的静态绑定与动态绑定
2010-09-26 10:08
267 查看
C++语言默认采用的是静态绑定。class Person { public: void func() { printf("AAAAAAAAAAAA/n"); } }; class Child : public Person { public : void func() { printf("BBBBBBBBBBBB/n"); } }; int main() { Child child; Person person = child; Person *ptr = &child; person.func(); ptr->func(); return 0; } 上述打印的结果: AAAAAAAAAAAA AAAAAAAAAAAA 因为动态绑定的执行效率更低,c++默认采用静态绑定。如果需要动态绑定,则需要特别声明,采用virtual标识。 1. 静态绑定:根据编译时申明的变量类型,来决定调用的是哪个类型的函数; 2. 动态绑定:根据运行时实际赋给变量的类型,来决定调用的是父类或子类的函数。 如果将Person类的func函数加上virtual修饰,让其成为虚函数。 class Person { public: virtual void func() { printf("AAAAAAAAAAAA/n"); } }; 上述打印的结果: AAAAAAAAAAAA BBBBBBBBBBBB 只有通过指针或引用来访问对象的虚函数时,才能够进行动态绑定。 故上述的 Person person = child; person.func(); 调用的函数还是Person类的func,因为没有动态绑定。 -------------------------------------------- 再举一例 #include <iostream> #include <stdlib.h> using namespace std; class CBase { public: virtual int func() const //虚函数 { cout<<"CBase function! "<<endl; return 100; } }; class CDerive : public CBase { public: int func() const //在派生类中重新定义虚函数 { cout<<"CDerive function! "<<endl; return 200; } }; int main() { CDerive obj1; CBase* p1 = &obj1; CBase& p2 = obj1; CBase p3 = obj1; CBase obj2; obj1.func(); //静态绑定:调用对象本身(派生类CDerive对象)的 func 函数 p1->func(); //动态绑定:调用被引用对象所属类(派生类CDerive)的 func 函数 p2.func(); //动态绑定:调用被引用对象所属类(派生类CDerive)的 func 函数 p3.func(); //静态绑定:调用对象本身(基类CBase对象)的函数 obj2.func(); //静态绑定:调用对象本身(基类CBase对象)的函数 return 0; } |
相关文章推荐
- C++的动态绑定和静态绑定
- More Effective C++ (静态绑定与动态类型)
- c++动态绑定和静态绑定
- c++的动态绑定和静态绑定
- 深入理解C++的动态绑定和静态绑定
- C++的静态绑定(称静态联编或者早绑定)和动态绑定(动态联编或者晚捆绑) 类继承virtural中用的
- 深入理解C++的动态绑定和静态绑定
- 深入理解C++的动态绑定和静态绑定
- C++的动态绑定和静态绑定
- 深入理解C++的动态绑定和静态绑定
- 深入理解C++的动态绑定和静态绑定
- C++的动态绑定和静态绑定
- 深入理解C++的动态绑定与静态绑定的应用详解
- 深入理解C++的动态绑定和静态绑定
- c++动态绑定与静态绑定
- 深入理解C++的动态绑定和静态绑定
- 关于静态绑定与动态绑定的辨别笔记----C++学习之路
- 深入理解C++的动态绑定与静态绑定的应用详解
- 深入理解C++的动态绑定和静态绑定--一个牛人写的文章,浅显易懂
- 深入理解C++的动态绑定和静态绑定