gpt4 book ai didi

c++ - 关于 MFC C++ 多态性

转载 作者:行者123 更新时间:2023-11-28 00:55:20 24 4
gpt4 key购买 nike

我被 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com