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

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

注意

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

単純な継承

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

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

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

多重継承

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

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

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

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

注意

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

複数クラスの継承の詳細については、「Multiple Inheritance」((NOTINBUILD) 多重継承) と「Multiple Base Classes」(複数の基底クラス) を参照してください。

抽象クラス

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

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

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

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

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

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

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

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

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

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

int main()  
{  
   Fish guppy;  
}  

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

匿名クラス

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

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

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

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

テンプレート クラス

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

コード要素 クラス デザイナー ビュー
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++ コードの使用 (クラス デザイナー)
クラスと構造体
匿名クラス型
(NOTINBUILD) 多重継承
複数の基底クラス
テンプレート