0

私が疑問に思っているのは、基本クラスがある場合、他のすべてのクラスが継承することは、C++では良い考えであるかどうかです。基本的に、C#のオブジェクトと同じインターフェイスがあります。

*ストレートインターフェースとデータ構造を除く

class Object
{
public:
    virtual ~Object() {}
    virtual std::string toString() const = 0;
    virtual Object* copy() const = 0;
    virtual void release() = 0;
private:
    // This operator overload calls toString() to print it out to the stream.
    friend std::ostream& operator<<(std::ostream& output, const Object& object);
};

これは良いことですか、それともクラスをコピーしたり、文字列に変換したりする場合は、個別のインターフェイスを作成する方がよいでしょうか。

例えば

class Copyable
{
public:
    virtual ~Copyable() {}
    virtual Copyable* copy() const = 0;
};

これについてはまったくわかりませんが、頭を悩ませています。:(

4

4 に答える 4

4

私はそれをしません。あなたObjectはすべてのクラスにそれらの純粋仮想メソッドを実装するように強制します。あなたが本当にそれらを必要としない場合はどうなりますか?

C ++には多重継承があるため、目的ごとに個別のクラスを作成し、派生クラスに必要な特性を決定させることができます。

これらの仮想関数を使用すると、すべてのクラスのすべてのインスタンスにvptrが追加されるため、オーバーヘッドも追加されます。恐ろしい効果はないかもしれませんが、C++スピリットIMOではありません。

最後に、C#とJavaObjectには、実行時の型に関するより多くの情報があるため、いくつかの便利なメソッドがあります。これにより、すべてのタイプに対して単一のルートを持つことが合理的になります。一部のC++フレームワークにもそれがありますが(MFCCObjectが思い浮かびます)、そのレベルで便利な機能を提供することはC++では簡単ではありません。純粋仮想メソッドを提供するだけでは不十分です。単一のルートを持つことによる主な利点は、ポリモーフィズムではなく、継承を介して共有実装を取得することです。ポリモーフィックな方法でを使用するObjectと、静的型付けが中断されるだけであり、あなたの場合、コードを再利用することすらできません。

于 2012-07-06T08:40:54.597 に答える
0

C ++には、主にパフォーマンス上の理由から、特にVMT(仮想メソッドテーブル)のために、すべてのオブジェクトに共通の基本クラスがありません。VMTは、少なくとも1つの仮想メソッドを持つすべてのオブジェクトに存在するポインターです。C ++の作成者は、単純なオブジェクト(たとえば、1つのintで構成される本体)をサポートしたいと考えていました。これは有効で合理的な目標です。

于 2012-07-06T08:35:55.583 に答える
0

これは、(Javaのように)言語レベルで適用された場合にのみ機能します。C++では、とにかく非オブジェクトオブジェクトを処理する必要があります。ライブラリを強制的にから継承する方法はありませんObject。から何かをインスタンス化するstd::と、コードに非オブジェクトオブジェクトが含まれます。

于 2012-07-06T08:51:28.443 に答える
0

ワンサイズですべての答えを出すのは難しいです。

それがあなたにどのような利益をもたらすかを考えてください。
次に、多重継承の複雑化など、それがどれだけの余分な作業を引き起こすかを考えてみましょう。

一般的に、これを行うことは、行わないことよりも多くの作業になるため、実質的な利益が得られるか、時間を無駄にしていることを確認する必要があります。

于 2012-07-06T10:40:57.840 に答える