设为首页 加入收藏

TOP

9.9.2 C++/CLI类的继承(1)
2013-10-07 12:38:06 来源: 作者: 【 】 浏览:67
Tags:9.9.2 /CLI 继承

9.9.2  C++(www.cppentry.com)/CLI类的继承(1)

虽然数值类总是以System::Object为基类,但我们不能定义派生自现有类的数值类。换句话说,我们在定义数值类时不能指定基类。这意味着数值类中的多态性仅限于在System::Object类中被定义为虚函数的那些函数。表9-2给出了所有数值类都要从System::Object类继承的虚函数。

表  9-2

    < xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

   

String^ ToString()

返回对象的String表示法,System::Object

类中的实现返回字符串形式的类名。我们

通常要在自己的类中重写该函数,以返

回对象值的字符串表示

bool Equals(Object^ obj)

比较当前对象与obj,如果二者相等则

返回true,否则返回false。这里的“相等”

意味着引用相等性—— 即两个对象是同一个。

我们通常要在自己的类中重写该函数,以便

当前对象与实参的值相等时,即二者的字段

相等时返回true

int GetHashCode()

返回当前对象的散列码—— 一个整数。

在存储(key,object)对的集合中,散列码用

作存储对象的键码。随后,我们通过提

供某个对象被存储时使用的键码,就

可以从这样的集合中将该对象检索出来


当然,因为System::Object也是引用类的基类,所以我们在引用类中也需要重写这些函数。

以定义本地C++(www.cppentry.com)派生类时所用的相同方式,我们可以从现有的引用类派生出新的引用类。让我们重新以C++(www.cppentry.com)/CLI程序的形式实现Ex9_12,该示例还示范了CLR程序中嵌套类的用法。我们可以首先定义Container类:

  1. // Container.h for Ex9_14  
  2. #pragma once  
  3. using namespace System;  
  4.  
  5. // Abstract base class for specific containers  
  6. ref class Container abstract  
  7. {  
  8. public:  
  9. // Function for calculating a volume - no content  
  10. // This is defined as an 'abstract' virtual function,  
  11. // indicated by the 'abstract' keyword  
  12. virtual double Volume() abstract;  
  13.  
  14. // Function to display a volume  
  15. virtual void ShowVolume()  
  16. {  
  17. Console::WriteLine(L"Volume is {0}", Volume());  
  18. }  
  19. }; 

首先需要注意的是类名后面的abstract关键字。如果某个C++(www.cppentry.com)/CLI类包含等价于本地C++(www.cppentry.com)类中纯虚函数的函数,那么我们必须将该类指定为abstract。当然,也可以将不包含任何抽象函数的类指定为abstract,这样可以阻止该类的对象被创建。abstract关键字还出现在Volume()函数成员声明的最后,以指出该函数是为本抽象类定义的。我们也可以像在本地C++(www.cppentry.com)类中那样,在Volume()声明的最后添加"= 0",但这样做不必要。

这里的Volume()和ShowVolume()函数都是虚函数,因此可以从Container派生的类类型的对象中多态地调用它们。

我们可以像下面这样定义Box类:

  1. // Box.h for Ex9_14  
  2. #pragma once  
  3. #include "Container.h" // For Container definition  
  4.  
  5. ref class Box : Container   // Derived class  
  6. {  
  7. public:  
  8. // Function to show the volume of an object  
  9. virtual void ShowVolume() override  
  10. {  
  11. Console::WriteLine(L"Box usable volume is {0}", Volume());  
  12. }  
  13.  
  14. // Function to calculate the volume of a Box object  
  15. virtual double Volume() override  
  16. { return m_Length*m_Width*m_Height; }  
  17.  
  18. // Constructor  
  19. Box() : m_Length(1.0), m_Width(1.0), m_Height(1.0){}  
  20.  
  21. // Constructor  
  22. Box(double lv, double wv, double hv)  
  23.                              : m_Length(lv), m_Width(wv), m_Height(hv){}  
  24. protected:  
  25. double m_Length;  
  26. double m_Width;  
  27. double m_Height;  
  28. }; 


引用类的基类总是公有的,默认情况下编译器认为是有public关键字的。我们可以显式地将基类指定为public,但这样做是不必要的。引用类的基类不能被指定为除public以外的任何东西。因为我们不能像在该类的本地C++(www.cppentry.com)版本中那样给形参提供默认值,所以定义了一个将所有3个字段初始化为1.0的无参数构造函数。Box类重写了从基类继承的Volume()函数。当需要重写基类中的某个函数时,我们必须总是指定override关键字。如果Box类不实现Volume()函数,那么它将是一个抽象类,而为了成功编译这个类,则需要将其指定为abstract。

下面是GlassBox类定义的代码:

  1. // GlassBox.h for Ex9_14  
  2. #pragma once  
  3. #include "Box.h" // For Box  
  4.  
  5. ref class GlassBox : Box        // Derived class  
  6. {  
  7. public:  
  8. // Function to calculate volume of a GlassBox  
  9. // allowing 15% for packing  
  10. virtual double Volume() override  
  11. { return 0.85*m_Length*m_Width*m_Height; }  
  12.  
  13. // Constructor  
  14. GlassBox(double lv, double wv, double hv): Box(lv, wv, hv){}  
  15. }; 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇9.9.2 C++/CLI类的继承(2) 下一篇9.9.6 被指定为new的函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: