派生类
派生类的数据成员
C++
现在的问题就是:创建派生类对象时,如何调用构造函数?
class CA
{
protected:
int m_a;
......
};
class CB:CA
{
protected:
int m_b;
......
};
CB w;
首先我们知道继承的派生类包含全部的数据成员,比如这里的 w
对于基类而言:
class CA
{
protected:
int m_a;
public:
CA(int n)
{
m_a=n;
}
......
};
是调用的如上构造函数,那么现在的问题就是想要CB中带有两个参数,其中有一个是CA中的
那么代码就应该这样写:
class CB:CA
{
protected:
int m_b;
public:
CB(int x, int y):CA(y)
{
m_b=x;
}
//还有一种写法
CB(int x, int y):CA(y),m_b=x;
{
}
......
};
创建w时,会用到CA和CB,那么,调用次序是怎么样的呢?
可以在构造函数中加入适应的提示语句,这里就不做演示,
直接说答案:先CA再CB;
也就是先调用基类构造函数,再调用派生类的构造函数。
同样的如果希望只带有一个参数也可以这样:
class CB:CA
{
protected:
int m_b;
public:
CB(int y):CA(y)
{
m_b=y;
}
};
这个就是将两个数据成员赋值为同一个值。
java
class CA
{
protected int m_a;
public CA(int n)
{
m_a=n;
}
......
};
class CB extends CA
{
protected int m_b;
public CB(int x,int y)
{
super(y);
m_a=x;
}
......
};
可以跟c++对比一下
新增和覆盖
c++
前提:在已有的CMyData基础上,新增CMyTime
class CMyData : public CMyTime
{
protected:
int hour,minut,second;
public:
CMyTime(int y=-1,int m=-1,int d=-1,int h=0,int m=0,int s=0):CMyData(y,m,d)
{
hour = h;
minut = m;
second = s;
}
};
判断时分秒是否合理:
bool CMyTime::isValid()
{
if(hour>=24 || hour<0 || minut<0 || minut>=60 ||second>=24 || second<0 )
return false;
else
return true;
}
允许派生类定义鱼基类同名的成员(数据成员和函数成员)–将造成对基类成员的覆盖或隐藏。
被覆盖或隐藏的成员需要通过特定的方式进行访问。
那么这个特定方式是这样的:
x.CMyData::isValid()
c++可以访问祖先,而不像java只能访问父类
java
想访问父类的数据成员用
super.x
只能访问父类,不能访问祖先
派生类的访问权限
进一步探讨派生类对基类的继承的访问权限。
要解决的问题:
- A从B继承了什么?
- A对B的访问权限是怎么样的?