1. ホーム
  2. c++

[解決済み] std::vector<AbstractClass> の宣言ができないのはなぜか?

2022-12-08 09:48:20

質問

C# での開発にかなりの時間を費やした結果、インターフェースとして使用する目的で抽象クラスを宣言した場合、子クラスのインスタンスを格納するためにこの抽象クラスのベクトルをインスタンス化することができないことに気づきました。

#pragma once
#include <iostream>
#include <vector>

using namespace std;

class IFunnyInterface
{
public:
    virtual void IamFunny()  = 0;
};

class FunnyImpl: IFunnyInterface
{
public:
    virtual void IamFunny()
    {
        cout << "<INSERT JOKE HERE>";
    }
};

class FunnyContainer
{
private:
    std::vector <IFunnyInterface> funnyItems;
};

抽象クラスのvectorを宣言している行は、MS VS2005でこのエラーを引き起こします。

error C2259: 'IFunnyInterface' : cannot instantiate abstract class

明らかな回避策が見えます。それは、IFunnyInterfaceを次のように置き換えることです。

class IFunnyInterface
{
public:
    virtual void IamFunny()
    {
        throw new std::exception("not implemented");
    }
};

これはC++的に許容できる回避策なのでしょうか? もしそうでなければ、これを回避するのに役立つ boost のようなサードパーティライブラリはありますか?

お読みいただきありがとうございます。

アンソニー

どのように解決するのですか?

抽象クラスはインスタンス化できないので、抽象クラスのベクターは機能しない。

しかし、抽象クラスへのポインタのベクトルを使用することができます。

std::vector<IFunnyInterface*> ifVec;

これはまた、実際にポリモーフィックな振る舞いを使うこともできます。たとえクラスが抽象的でなかったとしても、値によって保存することは、以下の問題につながります。 オブジェクトのスライス .