次の方法で共有


クラス デザイナの Visual C++ クラス

更新 : 2007 年 11 月

クラス デザイナは C++ クラスをサポートし、Visual Basic および Visual C# クラスの図形と同じ方法でネイティブ C++ クラスを視覚化します。ただし、C++ クラスは複数の継承関係を持つことができる点が異なります。クラスの図形を展開して、表示されるクラスのフィールドとメソッドを増やしたり、図形を折りたたんでスペースを広くしたりすることができます。

Bb385725.alert_note(ja-jp,VS.90).gifメモ :

クラス デザイナは共用体 (共用体の最大データ メンバに必要な量のメモリしか割り当てられない特殊なタイプのクラス) はサポートしていません。

単純な継承

クラス ダイアグラムに複数のクラスをドラッグするときに、これらのクラスにクラス継承関係があると、矢印によって各クラスが接続されます。矢印は、基本クラスの方向を指し示します。たとえば、クラス ダイアグラムに以下のクラスが表示される場合、矢印によって各クラスが接続され、B から A が指し示されます。

class A {};
class B : A {};

また、クラス ダイアグラムに B クラスのみをドラッグしてから、B のクラス図形を右クリックして、[基本クラスの表示] をクリックすることもできます。このようにすると、基本クラスである A が表示されます。

多重継承

クラス デザイナは、複数クラスの継承関係の視覚化をサポートしています。多重継承は、派生クラスが、複数の基本クラスの属性を持つときに使用されます。次に示すのは、多重継承の例です。

class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};

クラス ダイアグラムに複数のクラスをドラッグするときに、これらのクラスに複数クラスの継承関係があると、矢印によって各クラスが接続されます。矢印は、基本クラスの方向を指し示します。

クラスの図形を右クリックして [基本クラスの表示] をクリックすると、選択したクラスの基本クラスが表示されます。

Bb385725.alert_note(ja-jp,VS.90).gifメモ :

[派生クラスの表示] コマンドは、C++ コードについてはサポートされていません。派生クラスは、[クラス ビュー] を開き、型ノードを展開し、[派生型] サブフォルダを展開してからこれらの型をクラス ダイアグラムにドラッグすると表示できます。

複数クラスの継承の詳細については、「Multiple Inheritance」および「Multiple Base Classes」を参照してください。

抽象クラス

クラス デザイナは、抽象クラス ("抽出基本クラス" とも呼ばれます) をサポートしています。これらは、インスタンス化されることはありませんが、他のクラスを派生させることができるクラスです。このドキュメントで既に説明した「多重継承」の例を使用すると、次のように、Bird クラスを個々のオブジェクトとしてインスタンス化できます。

int main()
{
   Bird sparrow;
   Bird crow;
   Bird eagle;
}

ただし、Swimmer クラスを個々のオブジェクトとしてインスタンス化するわけではありません。そこから、Penguin、Whale、および Fish などのその他の種類の動物クラスを派生させるだけです。この場合、Swimmer クラスを抽象基本クラスとして宣言することになります。

クラスを抽象として宣言するには、abstract キーワードを使用できます。抽象としてマークされているメンバ、または抽象クラスのメンバは、仮想であり、抽象クラスから派生したクラスを使用して実装する必要があります。

class Swimmer abstract
{
   virtual void swim();
   void dive();
};

1 つ以上の純粋仮想関数を含めることで、クラスを抽象として宣言することもできます。

class Swimmer
{
   virtual void swim() = 0;
   void dive();
};

これらの宣言をクラス ダイアグラムで表示すると、クラス名の Swimmer とその純粋仮想関数である swim は、抽象クラスのシェイプで、[抽象クラス] 表記と共に斜体で表示されます。抽象クラスの型シェイプは、その境界線が点線であることを除いて、通常のクラスと同じです。

抽象基本クラスからの派生クラスは、基本クラスの各純粋仮想関数をオーバーライドする必要があります。オーバーライドしない場合、派生クラスをインスタンス化できません。そのため、たとえば、Fish クラスを Swimmer クラスから派生させた場合、Fish は、swim メソッドをオーバーライドする必要があります。

class Fish : public Swimmer
{
   void swim(int speed);
};

int main()
{
   Fish guppy;
}

このコードをクラス ダイアグラムで表示させると、クラス デザイナは、Fish から Swimmer へ継承線を描画します。

匿名クラス

クラス デザイナは、匿名クラスをサポートしています。匿名クラス型は、識別子なしで宣言されるクラスです。これはコンストラクタもデストラクタも持てず、引数として関数に渡すこともできず、関数からの戻り値として戻すこともできません。匿名クラスを使用して、次の例のように、クラス名を typedef 名に置き換えることができます。

typedef struct
{
    unsigned x;
    unsigned y;
} POINT;

構造体も匿名にできます。クラス デザイナは、匿名クラスと匿名構造体を、それぞれの型を表示するのと同じ方法で表示します。匿名クラスと匿名構造体は宣言および表示が可能できますが、クラス デザイナはユーザーが指定したタグ名を使用せず、クラス ビューが生成する名前を使用します。クラス ビューおよびクラス デザイナでは、クラスまたは構造体は、__unnamed という要素として表示されます。

匿名クラスの詳細については、「Anonymous Class Types」を参照してください。

テンプレート クラス

クラス デザイナは、テンプレート クラスの視覚化をサポートしています。入れ子になった宣言がサポートされています。次の表は、一般的な宣言を示しています。

コード要素

[クラス デザイナ] ビュー

template <class T>

class A {};

A<T>

テンプレート クラス

template <class T, class U>

class A {};

A<T, U>

テンプレート クラス

template <class T, int i>

class A {};

A<T, i>

テンプレート クラス

template <class T, template <class K> class U>

class A {};

A<T, U>

テンプレート クラス

次の表は、部分的特殊化の例です。

コード要素

[クラス デザイナ] ビュー

template<class T, class U>

class A {};

A<T, U>

テンプレート クラス

template<class T>

class A<T, T> {};

A<T, T>

テンプレート クラス

template <class T>

class A<T, int> {};

A<T, int>

テンプレート クラス

template <class T1, class T2>

class A<T1*, T2*> {};

A<T1*, T2*>

テンプレート クラス

次の表は、部分的特殊化における継承の例です。

コード要素

[クラス デザイナ] ビュー

template <class T, class U>

class A {};

template <class TC>

class A<T, int> {};

class B : A<int, float>

{};

class C : A<int, int>

{};

A<T, U>

テンプレート クラス

B

クラス

(A クラスを指します)

C

クラス

(A クラスを指します)

次の表は、部分的特殊化テンプレート関数の例です。

コード要素

[クラス デザイナ] ビュー

class A

{

template <class T, class U>

void func(T a, U b);

template <class T>

void func(T a, int b);

};

A

func<T, U> (+ 1 overload)

template <class T1>

class A {

template <class T2>

class B {};

};

template<> template<>

class A<type>::B<type> {};

A<T1>

テンプレート クラス

B<T2>

テンプレート クラス

(B は、[入れ子にされた型] の下の A クラスの中に含まれます)

template <class T>

class C {};

class A : C<int> {};

A

クラス

-> C<int>

C<T>

テンプレート クラス

次の表は、テンプレート継承の例です。

コード要素

[クラス デザイナ] ビュー

template <class T>

class C {};

template<>

class C<int> {

class B {};

}

class A : C<int>::B {};

A

クラス

->B

C<int>

クラス

(B は、[入れ子にされた型] の下の C クラスの中に含まれます。)

C<T>

テンプレート クラス

次の表は、標準特殊クラス接続の例です。

コード要素

[クラス デザイナ] ビュー

template <class T>

class C {};

template<>

class C<int> {};

class A : C<int> {};

class D : C<float> {};

A

クラス

->C<int>

C<int>

クラス

C<T>

テンプレート クラス

D

クラス

->C<float>

class B {

template <class T>

T min (const T &a, const T &b);

};

B

min <T>

参照

概念

クラス デザイナにおける Visual C++ コードの使用

参照

Classes, Structures, and Unions

Anonymous Class Types

Multiple Inheritance

Multiple Base Classes

その他の技術情報

Templates