存储类列表并通过在 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<B> b = boost::shared_ptr<B>(new B);
?
【参考方案1】:
这是一种称为切片的现象。答案是存储一个指针的容器,例如std::list<A*>
。请记住在完成后删除所有内容。
如果您可以使用 Boost 库,有一个名为 Pointer Container 的很棒的库可以帮助您完成此过程。
【讨论】:
【参考方案2】:如果你想要多态性,function
必须是 virtual
。
class A
A()
virtual void function()
【讨论】:
【参考方案3】:正如其他人所建议的那样,该功能应该是虚拟的。要将其存储在列表中,您需要将它们存储为指针(原始或使用 boost 包装器)。这样当您使用指针调用函数时,多态性就会出现并执行正确的函数。
【讨论】:
以上是关于存储类列表并通过在 C++ 中进行子类化来专门化一个函数?的主要内容,如果未能解决你的问题,请参考以下文章
C++ 将静态多态类自动添加到子类的 constexpr 列表中