静态多态性问题

Posted

技术标签:

【中文标题】静态多态性问题【英文标题】:Static Polymorphism Issue 【发布时间】:2016-05-12 01:21:20 【问题描述】:

我在一个微控制器上(这意味着我只能分配静态内存)并且我正在尝试使用继承.....

假设我有一个抽象类Image 和一个抽象类FontFont 的实例可以根据函数中给出的char 返回Image,如下所示:

Font* mf;
Image* image = mf->GetImage("a");

现在真正的问题是我不知道如何处理 GetImage 函数。

问题是这样的:在 c++ 中,要拥有一个抽象类的成员,就必须将它用作指针。所以我的困境是我有一个Font 想要创建一个新的Image 然后返回它。

如果它返回一个指向其新创建的Image 的指针,那么您将返回一个对临时对象的引用:

Image* FontImpl::GetImage(char c)
  return &ImageImpl(c);  //This object is destroyed once this function exits

然后,如果我返回,我会尝试返回一个像这样的实际类型:

Image FontImpl::GetImage(char c)
  return ImageImpl(c);   //Cannot cast from ImageImpl to Image

那么这种静态内存问题有成语之类的吗?

【问题讨论】:

什么是静态继承?您是指CRTP 提供的静态多态性 @πάνταῥεῖ 是的,我的意思是静态多态性......我将相应地编辑帖子 使用抽象基类是运行时多态而不是静态多态。你正在做静态内存分配。虽然如果这变得笨拙,您可能想探索编写或下载一个小型内存池类,所以自己从静态缓冲区进行一些动态分配。 【参考方案1】:

使用动态分配是最简单的,但如果不可能,您必须将实例存储在函数之外的某个位置,例如:

static ImageImpl image;

Image& FontImpl::GetImage(char c) 
  image = ImageImpl(c);
  return image;

【讨论】:

应该返回Image*&image,值得一提的是,在再次调用GetImage之前,需要完成任何需要使用“返回”图像的操作,因为它会覆盖之前返回的图像.

以上是关于静态多态性问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AbstractFactoryUnit 具有动态而不是静态多态性?

详细说明:方法重载是静态/编译时绑定,但不是多态性。将静态绑定与多态性相关联是不是正确?

使用 std::variant 的静态多态性

C++ 中是不是存在真正的静态多态性?

C++ 静态多态性 (CRTP) 和使用派生类的 typedef

java:从具有多态性的未知类调用静态方法[重复]