- 静态绑定发生在编译期,动态绑定发生在运行期;
- 对象的动态类型可以更改,但是静态类型无法更改;
- 要想实现动态,必须使用动态绑定;
- 在继承体系中只有虚函数使用的是动态绑定,其他的全部是静态绑定;
建议:
绝对不要重新定义继承而来的非虚(non-virtual)函数(《Effective C++ 第三版》条款36),因为这样导致函数调用由对象声明时的静态类型确定了,而和对象本身脱离了关系,没有多态,也这将给程序留下不可预知的隐患和莫名其妙的BUG;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class A { public:
void func() { std::cout << "A::func()\n"; } };
class B : public A { public: void func() { std::cout << "B::func()\n"; } };
class C : public A { public: void func() { std::cout << "C::func()\n"; } };
int main() { C *pc = new C(); B *pb = new B(); A *pa = pc; pa = pb; C *pnull = nullptr; pa->func(); pc->func(); pnull->func(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class A{ public: virtual void func(){ std::cout << "A::func()\n"; } }; class B : public A { public: void func() { std::cout << "B::func()\n"; } };
class C : public A { public: void func() { std::cout << "C::func()\n"; } }; C *pc = new C(); B *pb = new B(); A *pa = pc; pa = pb; C *pnull = nullptr; pa->func(); pc->func(); pnull->func();
|