0
#include <iostream>

class BarParent
{
    virtual void fuz()
    {
        std::cout << "BarParent" << std::endl;
    }
};

class BarChild : public BarParent
{
    virtual void fuz()
    {
        std::cout << "BarChild" << std::endl;
    }
};

class Foo
{
// ??BarParent bar;??
public:
    Foo(BarParent bar);
};

我寻求的是存储传递给构造函数的副本BarParent让它驻留Foo,同时仍然调用正确的virtual function

这是一个嵌入式应用程序:堆的使用是不受欢迎的。所以最好不要堆

摘要:据了解,由于切片问题(长话短说编译器无法确定泛型的大小Bar等复制它的类型转换),因此无法实现,因此无法实现多态性。使用模板可能是一个好主意,但是,它定义了多个classes Foo<typename BarType>,因此,做 afunctionchangeBar(BarParent)不可能的,因为编译器会将 thischangeBar(BarType)定义为仅为 class 定义Foo<Bartype>。如果有人有更好的主意,请告诉我。

我想我将不得不去堆或const Barparent指针。如果是用户const_cast,那是他自找麻烦,不是我的错!

4

2 回答 2

2
class Foo
{
    BarParent* bar; //or std::unique_ptr<>
public:
    Foo(BarParent* barInst):bar(barInst){}
};

这将做你想做的事。您存储一个指向BarParent对象的指针,您可以使用它来多态(这是一个词吗?)调用虚函数。

您需要在构造函数之外(在堆上或其他地方)创建副本,并将指向它的指针传递给foo对象构造函数。或者,您可以实现克隆方法,如仅使用基类指针复制派生实体中所述(无需详尽测试!)- C++

一种完全不同的方法是使用模板..它会给您留下多种foo<>类型..如果您不打算重新分配bar对象或将所有对象存储foo在容器中,这对您来说可能是更好的选择,因为它不涉及堆

template<typename BarType>
class Foo
{
    BarType bar; //pointer not needed any more since we are storing the exact type.
public:
    Foo(BarType& barInst):bar(barInst){}
};
于 2013-02-08T06:51:42.300 回答
0

我不知道没有对象切片就可以优雅地处理这个问题。

我能想到的唯一方法是使用指针,并在“调用”Foo构造函数时创建一个副本:

class Foo
{
    BarParent* bar;

public:
    Foo(BarParent* b) : bar(b) {}
};

BarChild child;

Foo myFoo(new BarChild(child));
于 2013-02-08T07:01:32.047 回答