ホームページ >バックエンド開発 >C++ >C で抽象クラスのベクトルを作成できますか?

C で抽象クラスのベクトルを作成できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-02 07:41:14423ブラウズ

Can You Create a Vector of Abstract Classes in C  ?

C の抽象クラスのベクトル : 入門

C では、抽象クラスは実装なしでインターフェイスを定義する方法を提供し、派生クラスを許可します。特定の動作を継承して実装します。ただし、インターフェイスを直接インスタンス化できる C# とは異なり、C の抽象クラスはインスタンス化できません。

問題

次の C の例を考えてみましょう:

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

この抽象クラスは、単一メソッド IamFunny とのインターフェイスを表します。ここで、このインターフェイスを実装するオブジェクトのベクトルを作成するとします。

std::vector<IFunnyInterface> funnyItems;

このコードでは、次のコンパイラ エラーが発生します。

error C2259: 'IFunnyInterface' : cannot instantiate abstract class

This error C では抽象クラスのインスタンス化が許可されていないために発生します。

A回避策

回避策の 1 つは、抽象クラスを、実装されていないメソッドを呼び出そうとしたときに例外をスローする具体的なクラスに置き換えることです。

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

この回避策では、ベクトルのインスタンス化が可能になります。 、これは潜在的な落とし穴をもたらします。IFunnyInterface オブジェクトのメソッドにアクセスしようとするコードは、例外。

代替ソリューション

より洗練された解決策は、抽象クラスへのポインタのベクトルを使用することです。

std::vector<IFunnyInterface*> ifVec;

このアプローチでは、ポリモーフィックな動作を実現し、直接値ストレージで発生する可能性のあるオブジェクトのスライスの問題を回避します。

C での抽象クラスのインスタンス化には制限があるため、適切な回避策を採用するか、代替手段を使用して、コード内で目的の機能を実現できます。

以上がC で抽象クラスのベクトルを作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。