存储类列表并通过在 C++ 中进行子类化来专门化一个函数?

Posted

技术标签:

【中文标题】存储类列表并通过在 C++ 中进行子类化来专门化一个函数?【英文标题】:Storing a list of classes and specialising a function by sub-classing in C++? 【发布时间】:2009-10-06 16:21:32 【问题描述】:

我正在尝试使用我希望如何执行特定功能的专业化来子类化一个类。但是,当我将类存储在列表中时,C++ 会隐式地将我的类转换为其基类。显然,该列表可以存储该类的任何子类,因此这是可以接受的,但是我将如何存储该类以便可以访问此特定功能。

我能想到的唯一方法是使用模板,还有其他选择吗?

这是一个例子:

class A

    A() 
    virtual void function()
    
    


class B : public A

    B() 
    void function()
    
    


boost::shared_ptr<B> b = boost::shared_ptr<B>(new b);
std::list<boost::shared_ptr<A> > objects;
objects.push_back(b);

// pull t out of objects

t.function();

编辑:过于简单化了,所以我已经修复了一些东西......

【问题讨论】:

我首先将function 设为虚拟。 这不是class A 的(副本)列表,而不是class A 的指针(或引用)列表吗? IIRC 这应该总是导致切片 发布实际编译并包含相关细节的真实(但简短)代码! 你的意思是boost::shared_ptr&lt;B&gt; b = boost::shared_ptr&lt;B&gt;(new B); 【参考方案1】:

这是一种称为切片的现象。答案是存储一个指针的容器,例如std::list&lt;A*&gt;。请记住在完成后删除所有内容。

如果您可以使用 Boost 库,有一个名为 Pointer Container 的很棒的库可以帮助您完成此过程。

【讨论】:

【参考方案2】:

如果你想要多态性,function 必须是 virtual

class A

    A() 
    virtual void function()
    
    

【讨论】:

【参考方案3】:

正如其他人所建议的那样,该功能应该是虚拟的。要将其存储在列表中,您需要将它们存储为指针(原始或使用 boost 包装器)。这样当您使用指针调用函数时,多态性就会出现并执行正确的函数。

【讨论】:

以上是关于存储类列表并通过在 C++ 中进行子类化来专门化一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 将静态多态类自动添加到子类的 constexpr 列表中

C++ 基类列表以及如何确定类类型

C++ 当子类的方法和父类的方法重名时...

SWIG C++ to Python:生成 Python 列表的子类

将对象的类类型保存到文件并在 C++ 中读回

c++ 在基类类型的向量中调用子类方法