我被 MFC C++ 多态性困住了,这是我的问题:
我有一个类,比如说 A,它实现了很多有用的东西,但是我需要从它实例化的每个对象都需要一些定制,所以我决定派生我的每个类(例如:A1、A2 ...)。 现在,这些对象的初始化需要一些对所有子类都相同的操作,所以我构建了一个执行此任务的静态方法,问题来了:
void CFastInit::FastGrid( const CStatic &stPosition, A *pGrid, UINT nID, CWnd *pWnd )
{
stPosition.GetClientRect( rctGriPos );
stPosition.MapWindowPoints( pWnd, rctGriPos );
pGrid->Create( WS_CHILD | WS_VISIBLE, rctGriPos, pWnd, nID );
pGrid->SetWholeRowSel();
}
从调试器中我可以看到 pGrid 的类型正确(A1、A2...),但是调用:
pGrid->Create(
对 A::Create 而不是 A1::Create 或 A2::Create。有解决方法吗?
最佳答案
您似乎有一个静态函数 FastGrid()
。请注意,此函数由基类的所有对象共享,和从基类派生的任何类的所有对象。
在此函数中,您将获取一个指向基类的指针作为参数:A *pGrid
,然后对该指针进行函数调用:pGrid->Create()
。
现在,如果 pGrid
指向一个派生 类对象,您需要 Create()
函数是虚拟的
,如果你想拥有多态性。如果它不是虚拟的,将始终调用基类的 Create()
函数。
可能你想要这样的东西:
class base
{
public:
static void foo( base * ptr)
{
ptr->bar();
}
virtual void bar()
{
std::cout << "base class bar() call" << std::endl;
}
};
class derived : public base
{
virtual void bar()
{
std::cout << "derived class bar() call" << std::endl;
}
};
int main(int argc, char *argv[])
{
base::foo( new derived() );
}
输出:
derived class bar() call
如果删除virtual
关键字,输出将是
base class bar() call
这就是你现在所拥有的。另请注意,我的示例中的静态函数也可以这样调用:derived::foo( new derived() );
,这不会改变任何内容。
关于c++ - 关于 MFC C++ 多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11759827/