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);
};

私が求めているのは、コンストラクターに渡されたコピーを保存し、正しいを呼び出しながら、に常駐させることですBarParentFoovirtual function

これは組み込みアプリケーションです。ヒープの使用は嫌われます。したがって、できればヒープなし

概要: 知る限りでは、スライシングの問題(コンパイラがジェネリックのサイズを判断できないBarなど、型キャストをコピーすること) のため、これを行うことはできません。そのため、ポリモーフィズムを実現できません。テンプレートを使用することは良い考えかもしれませんが、複数のclassesFoo<typename BarType>を定義します。その結果、コンパイラはこれを class に対してのみ定義されているものとして定義するため、functionなどを実行することはできません。誰かがより良いアイデアを持っている場合は、私に知らせてください。changeBar(BarParent)changeBar(BarType)Foo<Bartype>

私はヒープ、またはconst Barparentポインタに行く必要があると思います。ユーザーがconst_casts の場合、彼はトラブルを求めているのであって、私のせいではありません!

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

object slicingなしでこれを適切に処理する方法はありません。

Foo私が考えることができる唯一の方法は、ポインターを使用し、コンストラクターを「呼び出す」ときにコピーを作成することです。

class Foo
{
    BarParent* bar;

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

BarChild child;

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