2

Creature私はそれを抽象化する仮想関数を持っているインターフェースを持っています、それを呼びましょう。

、、、など、このインターフェイスの子クラスがDogありCatますPig

thing変数を抽象型として宣言できないため、コンパイラは次の行を好まないようですCreature

Creature thing = Dog();

インターフェイスなどをインスタンス化できないことは知っていますが、これは単にDogとして宣言されているだけCreatureです。

すべての子に対して1つの宣言を機能させる方法が必要です(つまり、、、または上記の行のどこDog()にあるCat()かを入力できるようにする)。Pig()Dog()

これはC++で実行できますか、それとも継承とインターフェイスを完全に悪用していますか?

4

2 に答える 2

9

オブジェクト型自体は、C++ では多態的ではありません。指定した行はオブジェクトを宣言し、Creatureオブジェクトで初期化しようとしDogます。が抽象的でない場合Creature、これはスライシングになります -thingDogもはや ではなく、Creature. Creature抽象的であるため、とにかくオブジェクトを持つことはできません。

ポリモーフィックな動作には、ポインターまたは参照を使用する必要があります。たとえば、次のように考えてください。

Creature* thing = new Dog();

動的型が であっても、逆参照thingして として使用できるようになりました。ただし、オブジェクトがある時点で d であることを手動で確認する必要があるため、通常、このような生のポインターを使用することはお勧めしません。所有権が混乱する可能性があります。あなたの最善の策は、次のようなスマートポインターに配置することです。CreatureDogdelete

std::unique_ptr<Creature> thing(new Dog()); // or std::make_unique when we have it

ここで を示しましstd::unique_ptrたが、スマート ポインターの選択は、そのオブジェクトの所有権のセマンティクスによって異なります。一般的な代替手段はstd::shared_ptr.

参照によるポリモーフィズムを示すには:

Dog dog;
Creature& thing = dog;
// Can now use dog as a Creature
于 2013-03-23T20:45:22.010 に答える
1

C++ では、値セマンティクスと参照セマンティクスの違いを理解する必要があります。一方、インタプリタ言語では、参照セマンティクスだけを扱う傾向があります (ただし、値セマンティクスを持っているが要点以外の単純な古いデータ オブジェクトの奇妙なケースを除きます)。

C++ では、すべてのオブジェクトは値です。たとえば、オブジェクトが になることはありませんnull。これは、宣言がストレージ要件を指定することを意味します。次のことを考慮してください

struct creature {
};

struct dog : public creature {
    float cuteness;
};

犬のストレージ要件は、クリーチャーのストレージ要件とは異なります。変換を許可したとしても、これによりスライスが発生します。たとえば、フィドは吠えますか、それとも黙っていますか? #含む

class creature {
public:
    virtual void speak() {
        std::cout << "..." << std::endl;
    }
};

class dog : public creature {
public:
    virtual void speak() {
        std::cout << "woof!" << std::endl;
    }
};

int main(int argc, const char *argv[]) {
    creature fido;
    fido = dog();

    fido.speak();
    return 0;
}

ただし、オブジェクトへのポインターまたは参照を単に持つ場合は、別の問題です。ポインタで。

creature* fido = new dog();
fido->speak();
delete fido;

参考までに。

dog fido;
creature& c = fido;

c.speak();

この質問の範囲を超えていますが、オプションでスマートポインターです。

std::unique_ptr<creature> fido(new dog);
于 2013-03-23T21:49:11.640 に答える