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

标签 c++ visual-c++ mfc polymorphism

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

相关文章:

c# - 委托(delegate)从引用的 C++ DLL 触发 C# 函数

url - 如何在C++程序中打开URL

c++ - 为处于挂起状态的线程调用 TerminateThread C++

c++ - 左移位运算符重载

c++ - 如何在C++中获取vector中元素的等级

c++ - 未定义的行为和顺序点

visual-c++ - CefSharp 在 Windows 7 和 8.1 上崩溃但在 Windows 10 上运行

c++ - 可在 CPU 或 GPU 中灵活运行的 CUDA 推力仿函数

c++ - MFC 单选按钮 - DDX_Radio 和 DDX_Control 行为

c++ - MFC 图片控制