类设计器支持以下 C++ 代码元素 :
-
类(与托管类形状类似,只不过它可以具有多重继承关系)
-
匿名类(显示类视图为匿名类型生成的名称)
-
类设计器中的 C++ 类
类设计器支持 C++ 类,直观显示本机 C++ 类的方式与直观显示 Visual Basic 和 C# 类形状时大致相同,不同之处在于 C++ 类可以有多个继承关系 。 可以展开类形状来显示类中的更多字段和方法,也可以折叠类形状来节省空间。
备注
类设计器不支持联合(一种特殊类型的类,仅分配联合的最大数据成员所需的内存量) 。
简单继承
如果将存在单类继承关系的多个类拖到类图上,它们将会通过箭头相连。 箭头指向基类的方向。 例如,如果类图中有以下类,这两个类将会通过箭头相连,箭头从 B 指向 A:
C++复制
class A {}; class B : A {};
也可以只将类 B 拖到类图中,右键单击 B 的类形状,然后单击“显示基类” 。 这样可以显示它的基类 A。
多重继承
类设计器支持直观显示多类继承关系 。 当派生类有多个基类的特性时,就会用到多重继承。 下面的示例展示了多重继承:
C++复制
class Bird {}; class Swimmer {}; class Penguin : public Bird, public Swimmer {};
如果将存在多类继承关系的多个类拖到类图上,它们将会通过箭头相连。 箭头指向基类的方向。
右键单击类形状,然后单击“显示基类” ,可以显示选定类的基类。
备注
C++ 代码不支持“显示派生类” 命令。 可以转到类视图,依次展开类型节点和“Derived Types”子文件夹,然后将这些类型拖到类图上,即可显示派生类 。
有关多类继承的详细信息,请参阅多重继承和多个基类。
抽象类
类设计器支持抽象类(亦称为“抽象基类”) 。 这些是永不实例化,但可从中派生其他类的类。 以本文前面“多重继承”部分中的示例为例,可以将
Bird
类实例化成各个单独的对象,如下所示:C++复制
int main() {Bird sparrow;Bird crow;Bird eagle; }
不过,你可能不打算将
Swimmer
类实例化成各个单独的对象。 可能只打算从它派生其他类型的动物类,例如,Penguin
、Whale
和Fish
。 在这种情况下,需要将Swimmer
类声明为抽象基类。若要将类声明为抽象类,可以使用
abstract
关键字。 标记为 abstract 或抽象类中包含的成员是虚成员,必须由派生自抽象类的类实现。C++复制
class Swimmer abstract {virtual void swim();void dive(); };
此外,也可以通过添加至少一个纯虚函数,将类声明为抽象类:
C++复制
class Swimmer {virtual void swim() = 0;void dive(); };
在类图中显示这些声明时,类名
Swimmer
及其纯虚函数swim
会连同标注“抽象类” 一起在抽象类形状中以斜体显示。 请注意,抽象类类型形状与常规类类型形状大致相同,不同之处在于抽象类类型形状的边框是虚线。派生自抽象基类的类必须替代基类中的每个纯虚函数,否则无法实例化派生类。 比方说,如果
Fish
类派生自Swimmer
类,Fish
必须替代swim
方法:C++复制
class Fish : public Swimmer {void swim(int speed); };int main() {Fish guppy; }
在类图中显示此代码时,类图会绘制一条从
Fish
到Swimmer
的继承线。匿名类
类设计器支持匿名类 。 匿名类类型是指未使用标识符声明的类。 匿名类不能有构造函数或析构函数,不能作为自变量传递给函数,也不能作为返回值从函数返回。 匿名类可用于将类名替换为 typedef 名称,如以下示例所示:
C++复制
typedef struct {unsigned x;unsigned y; } POINT;
结构也可以是匿名的。 类设计器显示匿名类和结构的方式与显示各自类型的方式相同 。 虽然可以声明并显示匿名类和结构,但类设计器不会使用你指定的标记名称 。 而是使用类视图生成的名称。 类或结构作为 __unnamed 元素显示在类视图和类设计器中 。
有关匿名类的详细信息,请参阅匿名类类型。