龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++/CLI思辨录之再谈继承

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
在面向对象编程领域一个要害的概念是继续。 在OO和C++中,类成员共有三种级别的继续:public,protected和private。对于基类成员的存取操作应该依靠于下面两个因素: 派生类声明其类头

  在面向对象编程领域一个要害的概念是继续。

  

  在OO和C++中,类成员共有三种级别的继续:public,protected和private。对于基类成员的存取操作应该依靠于下面两个因素:

  

  派生类声明其类头(public, protected 或 private)的方式

  

  对类成员的存取指定标志(public, protected 或 private)

  

  假如你在基类中声明成员为private,那么这些成员对于任何派生类都是不可存取的。

  

  假如你在基类中声明成员为protected,而且新类是基类的私有派生,那么这些成员在派生类中变为私有的。

  

  假如你在基类中声明成员为protected,而且新类是基类的protected 型派生,那么这些成员在派生类中变为protected 的。

  

  假如你在基类中声明成员为protected,而且新类是基类的public 型派生,那么这些成员在派生类中变为protected的。

  

  假如你在基类中声明成员为public,而且新类是基类的private 型派生,那么这些成员在派生类中变为private 的。

  

  假如你在基类中声明成员为public,而且新类是基类的protected 型派生,那么这些成员在派生类中变为protected的。

  

  假如你在基类中声明成员为public,而且新类是基类的public 型派生,那么这些成员在派生类中变为public 的。

  

  这是一些老式的C++规则。在.Net中,情况就大大不同了-.Net仅支持public继续。但是当一个类被public继续,则基类的保护成员将对新的派生类成为private的。

  

  考虑下面的三个C++类:

  

  

class A

  {

   protected: void fa()

   { printf("fa called"); }

  };

  class B : public A

  {

   public: void fb()

   { fa(); }

  };

  class C : public B

  {

   public: void fc()

   { fa(); }

  };

  int main()

  {

   C c;

   c.fc();

   return 0;

  }

  根据我前面介绍的规则,在C++中这些代码是能成功运行的。但是假如你把它们改变为托管类,则在类c中是不能调用fa()的。

  

精彩图集

赞助商链接