动态绑定的时机
- 在类的构造函数中调用的任何(虚)函数,都不会发生动态绑定。
- 如果不是通过指针或引用调用虚函数,也还是静态绑定。
class Base
{
public:
Base(int data = 10) : ma(data) { cout << "Base" << endl; }
virtual ~Base() { cout << "~Base" << endl; }
virtual void show() { cout << "Base::show()" << endl; }
virtual void show(int) { cout << "Base:show(int)" << endl; }
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data = 20) : Base(data), mb(data) { cout << "Derive" << endl; }
~Derive() { cout << "~Derive" << endl; } // 自动成为虚函数,会覆盖基类虚析构函数
void show() { cout << "Derive::show()" << endl; }
private:
int mb;
};
int main()
{
Base b(10);
Derive d(10);
//用对象本身调用虚函数,是静态绑定
b.show();
d.show();
//用指针或引用调用虚函数,是动态绑定
Base* b1 = &b;
Base* b2 = &d;
Base& b3 = b;
Base& b4 = d;
b1->show();
b2->show();
b3.show();
b4.show();
Derive* dptr = (Derive*)&b;
dptr->show(); //看的是b中虚函数表的show方法,即Base::show()
return 0;
}
标签:Derive,show,31,绑定,Base,dptr,动态
From: https://www.cnblogs.com/sio2zyh/p/17987567