クラス デザイナーの Visual C++ クラスVisual C++ Classes in Class Designer

クラス デザイナーは、C++ クラスをサポートし、Visual Basic および Visual C# クラスの図形と同じ方法でネイティブの C++ クラスを視覚化します。ただし、C++ クラスは複数の継承関係を持つことができる点が異なります。Class Designer supports C++ classes and visualizes native C++ classes in the same way as Visual Basic and Visual C# class shapes, except that C++ classes can have multiple inheritance relationships. クラスの図形を展開して、表示されるクラスのフィールドとメソッドを増やしたり、図形を折りたたんでスペースを節約したりすることができます。You can expand the class shape to show more fields and methods in the class or collapse it to conserve space.

注意

クラス デザイナーは、共用体 (共用体の最大データ メンバーに必要な量のメモリしか割り当てられない特殊なタイプのクラス) をサポートしていません。Class Designer does not support unions (a special type of class in which the memory allocated is only the amount necessary for the union's largest data member).

単純な継承Simple Inheritance

クラス ダイアグラムに複数のクラスをドラッグした場合、これらのクラスにクラス継承関係があると、矢印によって各クラスが接続されます。When you drag more than one class onto a class diagram, and the classes have a class inheritance relationship, an arrow connects them. 矢印は、基底クラスの方向を指し示します。The arrow points in the direction of the base class. たとえば、クラス ダイアグラムに以下のクラスが表示される場合、矢印によって各クラスが接続され、B から A が指し示されます。For example, when the following classes are displayed in a class diagram, an arrow connects them, pointing from B to A:

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

また、クラス ダイアグラムに B クラスのみをドラッグしてから、B のクラス図形を右クリックして、[基底クラスの表示] をクリックすることもできます。You can also drag only class B to the class diagram, right-click the class shape for B, and then click Show Base Classes. このようにすると、基底クラスである A が表示されます。This displays its base class: A.

多重継承Multiple Inheritance

クラス デザイナーは、複数クラスの継承関係の視覚化をサポートしています。Class Designer supports the visualization of multiple-class inheritance relationships. 多重継承は、派生クラスが複数の基底クラスの属性を持つときに使用されます。Multiple inheritance is used when a derived class has attributes of more than one base class. 多重継承の例を次に示します。Following is an example of multiple inheritance:

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

クラス ダイアグラムに複数のクラスをドラッグするときに、これらのクラスに複数クラスの継承関係があると、矢印によって各クラスが接続されます。When you drag more than one class onto the class diagram, and the classes have a multiple-class inheritance relationship, an arrow connects them. 矢印は、基底クラスの方向を指し示します。The arrow points in the direction of the base classes.

クラスの図形を右クリックして [基底クラスの表示] をクリックすると、選択したクラスの基底クラスが表示されます。Right-clicking a class shape and then clicking Show Base Classes displays the base classes for the selected class.

注意

[派生クラスの表示] コマンドは、C++ コードについてはサポートされていません。The Show Derived Classes command is not supported for C++ code. 派生クラスは、[クラス ビュー] を開き、型ノードを展開し、[派生型] サブフォルダーを展開してからこれらの型をクラス ダイアグラムにドラッグすると表示できます。You can display derived classes by going to Class View, expanding the type node, expanding the Derived Types subfolder, and then dragging those types onto the class diagram.

複数クラスの継承の詳細については、「Multiple Inheritance」 (多重継承) と「Multiple Base Classes」 (複数の基底クラス) を参照してください。For more information about multiple-class inheritance, see Multiple Inheritance and Multiple Base Classes.

抽象クラスAbstract Classes

クラス デザイナーは、抽象クラス ("抽象基底クラス" とも呼ばれます) をサポートしています。Class Designer supports abstract classes (also named "abstract base classes"). これらは、インスタンス化されることはありませんが、他のクラスを派生させることができるクラスです。These are classes that you never instantiate, but from which you can derive other classes. このドキュメントで既に説明した "多重継承" の例を使用すると、次のように、Bird クラスを個々のオブジェクトとしてインスタンス化できます。Using an example from "Multiple Inheritance" earlier in this document, you might instantiate the Bird class as individual objects as follows:

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

ただし、Swimmer クラスを個々のオブジェクトとしてインスタンス化するわけではありません。However, you might not intend to instantiate the Swimmer class as individual objects. そのクラスから、PenguinWhaleFish などのその他の種類の動物クラスを派生させるだけです。You might intend only to derive other types of animal classes from it, for example, Penguin, Whale, and Fish. この場合、Swimmer クラスを抽象基底クラスとして宣言することになります。In that case, you would declare the Swimmer class as an abstract base class.

クラスを抽象として宣言するには、abstract キーワードを使用することができます。To declare a class as abstract, you can use the abstract keyword. 抽象としてマークされているメンバー、または抽象クラスに含まれているメンバーは、仮想であり、抽象クラスから派生したクラスを使用して実装する必要があります。Members marked as abstract, or included in an abstract class, are virtual and must be implemented by classes that derive from the abstract class.

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

1 つ以上の純粋仮想関数を含めることで、クラスを抽象として宣言することもできます。You can also declare a class as abstract by including at least one pure virtual function:

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

これらの宣言をクラス ダイアグラムで表示すると、クラス名の Swimmer とその純粋仮想関数である swim は、抽象クラスの図形で、[抽象クラス] の表記とともに斜体で表示されます。When you display these declarations in a Class Diagram, the class name Swimmer and its pure virtual function swim are in displayed in italic in an abstract class shape, together with the notation Abstract Class. 抽象クラス型の図形は、枠線が点線である点を除いて、通常のクラスと同じです。Notice that the abstract class type shape is the same as that of a regular class, except that its border is a dotted line.

抽象基底クラスからの派生クラスは、基底クラスの各純粋仮想関数をオーバーライドする必要があります。オーバーライドしない場合、派生クラスをインスタンス化できません。A class derived from an abstract base class must override each pure virtual function in the base class, or the derived class cannot be instantiated. そのため、たとえば、Fish クラスを Swimmer クラスから派生させた場合、Fishswim メソッドをオーバーライドする必要があります。So, for example, if you derive a Fish class from the Swimmer class, Fish must override the swim method:

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

int main()  
{  
   Fish guppy;  
}  

このコードをクラス ダイアグラムで表示すると、クラス デザイナーは Fish から Swimmer へ継承線を描画します。When you display this code in a Class Diagram, Class Designer draws an inheritance line from Fish to Swimmer.

匿名クラスAnonymous Classes

クラス デザイナーは、匿名クラスをサポートしています。Class Designer supports anonymous classes. 匿名クラス型は、識別子なしで宣言されるクラスです。Anonymous class types are classes declared without an identifier. これはコンストラクターもデストラクターも持てず、引数として関数に渡すこともできず、関数からの戻り値として戻すこともできません。They cannot have a constructor or destructor, cannot be passed as arguments to functions, and cannot be returned as return values from functions. 匿名クラスを使用して、次の例のように、クラス名を typedef 名に置き換えることができます。You can use an anonymous class to replace a class name with a typedef name, as in the following example:

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

構造体も匿名にできます。Structures can also be anonymous. クラス デザイナーは、匿名クラスと匿名構造体を、それぞれの型を表示するのと同じ方法で表示します。Class Designer displays anonymous classes and structures the same as it displays the respective type. 匿名クラスと匿名構造体はユーザーが宣言および表示できますが、クラス デザイナーはユーザーが指定したタグ名を使用しません。Although you can declare and display anonymous classes and structures, Class Designer will not use the tag name that you specify. クラス ビューが生成する名前を使用します。It will use the name that Class View generates. クラス ビューおよびクラス デザイナーでは、クラスまたは構造体は __unnamed という要素として表示されます。The class or structure appears in Class View and Class Designer as an element called __unnamed.

匿名クラスの詳細については、「匿名クラス型」を参照してください。For more information about anonymous classes, see Anonymous Class Types.

テンプレート クラスTemplate Classes

クラス デザイナーは、テンプレート クラスの視覚化をサポートしています。Class Designer supports the visualization of template classes. 入れ子になった宣言がサポートされています。Nested declarations are supported. 次の表は、一般的な宣言を示しています。The following table shows some typical declarations.

コード要素Code element クラス デザイナー ビューClass Designer view
template <class T>

class A {};
A<T>

テンプレート クラスTemplate Class
template <class T, class U>

class A {};
A<T, U>

テンプレート クラスTemplate Class
template <class T, int i>

class A {};
A<T, i>

テンプレート クラスTemplate Class
template <class T, template <class K> class U>

class A {};
A<T, U>

テンプレート クラスTemplate Class

次の表は、部分的特殊化の例です。The following table shows some examples of partial specialization.

コード要素Code element クラス デザイナー ビューClass Designer view
template<class T, class U>

class A {};
A<T, U>

テンプレート クラスTemplate Class
template<class T>

class A<T, T> {};
A<T, T>

テンプレート クラスTemplate Class
template <class T>

class A<T, int> {};
A<T, int>

テンプレート クラスTemplate Class
template <class T1, class T2>

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

テンプレート クラスTemplate Class

次の表は、部分的特殊化における継承の例です。The following table shows some examples of inheritance in partial specialization.

コード要素Code element クラス デザイナー ビューClass Designer view
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>

テンプレート クラスTemplate Class

B

クラスClass

(クラス A を指します)(points to Class A)

C

クラスClass

(クラス A を指します)(points to Class A)

次の表は、部分的特殊化テンプレート関数の例です。The following table shows some examples of partial specialization template functions.

コード要素Code element クラス デザイナー ビューClass Designer view
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)func<T, U> (+ 1 overload)
template <class T1>

class A {

template <class T2>

class B {};

};

template<> template<>

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

テンプレート クラスTemplate Class

B<T2>

テンプレート クラスTemplate Class

(B は、[入れ子にされた型] の下のクラス A の中に含まれます)(B is contained within class A under Nested Types)
template <class T>

class C {};

class A : C<int> {};
A

クラスClass

-> C<int>-> C<int>

C<T>

テンプレート クラスTemplate Class

次の表は、テンプレート継承の例です。The following table shows some examples of template inheritance.

コード要素Code element クラス デザイナー ビューClass Designer view
template <class T>

class C {};

template<>

class C<int> {

class B {};

}

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

クラスClass

->B->B

C<int>

クラスClass

(B は、[入れ子にされた型] の下のクラス C の中に含まれます)(B is contained within class C under Nested Types)

C<T>

テンプレート クラスTemplate Class

次の表は、標準特殊クラス接続の例です。The following table shows some examples of canonical specialized class connection.

コード要素Code element クラス デザイナー ビューClass Designer view
template <class T>

class C {};

template<>

class C<int> {};

class A : C<int> {};

class D : C<float> {};
A

クラスClass

->C<int>->C<int>

C<int>

クラスClass

C<T>

テンプレート クラスTemplate Class

D

クラスClass

->C<float>->C<float>
class B {

template <class T>

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

};
B

min <T>min <T>

関連項目See Also

Visual C++ コードの使用 (クラス デザイナー) Working with Visual C++ Code (Class Designer)
クラスと構造体 Classes and Structs
匿名クラス型 Anonymous Class Types
多重継承 Multiple Inheritance
複数の基底クラス Multiple Base Classes
テンプレートTemplates