具体详解可以参考这篇文章《C++ 虚函数表解析》;
关于C++虚函数的文章网上有很多,这里简明的说明一下;
C++虚函数的目的就是为了实现多态;
多态定义(C++大学教程(第二版)):通过继承相关的不同类,它们的对象能够对同一个函数调用做出不同相应。
多态死通过虚函数实现的。当通过基类指针(或引用)请求适用虚函数时,C++在与对象关联的派生类中正确的选择重定义的函数。
示例1:
class CA
{
private:
static UINT prc( PVOID pParam )
{
CA * pCA = (CA*)pParam;
while(1)
{
Sleep(1000);
pCA->show();
}
return 0;
}
public:
CA()
{
// AfxBeginThread( prc, this );
}
public:
virtual void show()
{
AfxMessageBox("CA show");
}
};
class CB : public CA
{
public:
virtual void show()
{
AfxMessageBox("CB show");
}
};
class CC : public CA
{
public:
virtual void show()
{
AfxMessageBox("CC show");
}
};
void CTDlg::OnButtonClick()
{
// TODO: Add your control notification handler code here
CA * pCA2CA = (CA*)(new CA);
pCA2CA->show();
CA * pCA2CB = (CA*)(new CB);
pCA2CB->show();
CA * pCA2CC = (CA*)(new CC );
pCA2CC->show();
}
运行结果:显示: CA, CB, CC 相应对话框;
注:这里的应用最典型的就是, shape的draw函数, 然后继承多种类型,然后具体实现;可以cpicture绘制图片, cline绘制线条等等;
示例2:
class CA
{
private:
static UINT prc( PVOID pParam )
{
CA * pCA = (CA*)pParam;
while(1)
{
Sleep(1000);
pCA->show();
}
return 0;
}
public:
CA()
{
AfxBeginThread( prc, this );
}
public:
virtual void show()
{
AfxMessageBox("CA show");
}
};
class CB : public CA
{
public:
virtual void show()
{
AfxMessageBox("CB show");
}
};
void CTDlg::OnButtonClick()
{
CA * pCA2CB = (CA*)(new CB);
//或者 new CB();
}
显示结果:AfxMessageBox("CB show");
注释:在线程中:CA * pCA = (CA*)pParam; pCA其实指向了CB;
因为内存结构中,CB的开头部分CA后面部分是新添加的内容;
构造顺序是,先构造CA接着就是CB先添加的内容;
通过示例2,可以知道父类可以预留接口然后自动调用;