C++/CLI思辨录之再谈继承
在 面向对象 编程领域一个关键的概念是继承。 在OO和C++中,类成员共有三种级别的继承:public,protected和private。对于基类成员的存取操作应该依赖于下面两个因素: 派生类声明其类头(public, protected 或 private)的方式 对类成员的存取指定标志(public,
在
面向对象编程领域一个关键的概念是继承。
在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++类:
clearcase/" target="_blank" >cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1">
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()的。
原文转自:http://www.ltesting.net
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
|