-1

まず、私は C++ の初心者で、特に C++ を OOP 形式で使用しています。複数のサブクラスを持つクラスがあり、格納できるオブジェクトを制限することなく、オブジェクトを受け入れる変数をあいまいに宣言できるかどうか疑問に思っていました。一度に複数の子のうちの1つが使用されることになるので、私は尋ねています。したがって、変数をあいまいに宣言できない場合は、多数の変数のどれが使用されているかを判断する方法があります。

の線に沿った何か

obj randomObj = new className;

それ以外の

className randomObj = new className

4

3 に答える 3

0

すべてのクラスは共通の基本クラスから派生しているため、変数をその基本クラスタイプとして宣言できますが、それでも派生クラスを割り当てることができます。例:

class BaseClass
{
...
};

class DerivedClass : public BaseClass
{
...
};

BaseClass *randomObj = new DerivedClass;
于 2012-10-25T23:16:34.463 に答える
0

コンテナは、同じタイプのオブジェクトのみで構成できます。異種コレクションが必要な場合は、「ハンドル」タイプをコンテナに貼り付けて、オブジェクトに間接的にアクセスする必要があります。標準のハンドルタイプはポインタであり、標準の構造はstd::vector<std::unique_ptr<Base>>次のようになります。

#include <memory>
#include <utility>
#include <vector>

template <typename T, typename ...Args>
std::unique_ptr<T> make_unique(Args &&... args)
{
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); // or "::new"
}

struct Base
{
     virtual ~Base() { }
};

struct Derived1 : Base { /* ... */ };
struct Derived2 : Base { /* ... */ };
struct Derived3 : Base { /* ... */ };

std::vector<std::unique_ptr<Base>> v;

使用法:

v.push_back(make_unique<Derived1>(true, 'a'));
v.push_back(make_unique<Derived2>(11, 22, 33));
v.push_back(make_unique<Derived3>("hello", "world"));
于 2012-10-25T23:17:16.730 に答える
0

あなたは C++ は初めてだと言いますが、必要なものを記述するために使用する構文は、Java や C# などの別の言語に精通していることを示唆しています。表示する構文は、これらの言語で正常に機能します。

Foo myFoo = new DerivedFoo;

これは、Java と C# の舞台裏でmyFoo、Foo を格納できる固定メモリ領域の名前としてではなく、Foo へのポインターとして実際に動作するためです。C++ では、構文Foo myFooによってこのような固定メモリ領域が作成されます。これを実行して派生型を配置しようとしても、次のようになります。

DerivedFoo myDerivedFoo;
Foo myFoo = myDerivedFoo;

myFooFoo オブジェクトしか保持できません。Foo ではないものはすべて、myFoo固定メモリ領域に収まらないため、の初期化中に「スライス」されます。

したがって、C++ では、C++ のポインター構文を使用して、Java と C# が舞台裏で行うことを明示的に行う必要があります。

    Foo *myFoo = new DerivedFoo;

現在myFooは Foo へのポインターであり、そのポインターはFooDerivedFoo の Foo 部分を含む任意のオブジェクトを、スライスや何も発生することなく参照できます。new DerivedFooDerivedFoo が存在できるメモリ領域を作成し、作成された の部分myFooを指すように設定されます。FooDerivedFoo

于 2012-10-25T23:36:19.000 に答える