【问题标题】:Storing a list of classes and specialising a function by sub-classing in C++?存储类列表并通过在 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);

标签: c++ inheritance


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    class A
    {
        A() {}
        virtual void function()
        {
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-12
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多