关于子类的继承方式测试
class Base
{
privated:
int _a;
protected:
int _b;
public :
int _c;
void setb(int b)
{
_b = b;
}
int getb()
{
return _b;
}
};
首先父类对象可以通过父类内公有成员函数访问保护成员数据
比如 :
int main()
{
Base v;
v.setb(5);
cout << v.getb();
} 这样访问是合法的,但不可以直接 cout << v._b ; 这样访问
在公有继承 public继承中
基类的公有成员和保护成员在派生类中还是公有成员和保护成员,所以派生类内的成员函数可以直接访问,但基类的私有成员在派生类中比派生类的私有成员更私有,因为派生类的成员函数可以直接访问派生类的私有成员,却不可以直接访问基类的私有成员,派生类只能通过基类提供的公有成员函数访问基类的私有成员,所以说比私有更私有
1、在子类内部,子类的成员函数可以直接访问父类的保护成员(protected)和公有成员(public)
2、子类的对象不能直接调用基类的保护成员,要通过基类提供的公有成员函数或子类的成员函数访问
class Derived :public Base
{
int getb()
{
return _b; //在子类成员函数可以直接访问父类的保护成员
}
};
3、在子类内部若要访问基类的私有成员,要通过调用基类的公有成员函数访问,不允许派生类的成员函数直接访问基类的私有成员,子类的对象可以直接调用基类的公有成员,直接方式:对象名.成员名
2、派生类的对象不能以直接方式访问基类的保护成员
4、在派生类中声明的名字如果与基类中声明的名字相同,则派生类的名字起作用
私有派生private:
基类的公有成员和保护成员成为派生类的私有成员,能被派生类的成员函数直接访问,但不能再通过
派生类对象名.基类公有成员名 方式访问基类的公有成员,因为这时基类的公有成员已经成为派生类的私有成员,
那么基类的私有成员去哪了
通过实验发现,在派生类中的成员函数可以 通过基类提供的 访问和设置 私有成员的公有函数间接访问基类的私有成员,基类的私有成员还是可以访问的,但这时基类提供的 访问和设置 私有成员的公有函数 在派生类里变成了私有函数,所以在派生类里要写成员函数去访问这些私有函数来间接访问基类的私有变量
比如:
class Base
{
private:
int _s;
public:
void sets(int a)
{
_s = a;
}
int gets()
{
return _s;
}
}
class Derived:private Base
{
public:
int getccs() //写成员函数间接访问基类的私有成员
{
return gets();
}
void setccs(int b)
{
sets(b);
}
}
int main()
{
Derived c;
c.setccs(5); //访问基类的私有成员
cout << c.getccs() << endl;
}
和公有继承相比,公有继承的子类的对象可以直接 通过基类提供的 访问和设置 私有成员的公有函数访问基类的私有成员。而私有继承,那些公共函数在派生类内变成私有的了,私有继承的子类的对象不可以直接调用私有函数,所有的对象都不可以直接调用私有成员,所以私有继承的子类需要写 成员函数去访问这些已经变成私有成员的 函数,去访问基类的私有成员
保护继承 protected
保护成员可被本类或派生类的成员函数访问,但不能被外部函数访问。为了便于派生类的访问,可以将基类中需要提供给派生类访问的私有成员定义为保护成员。
保护成员:
若为公有派生,则基类的保护成员在派生类中也为保护成员,可被派生类成员函数直接访问
若为私有继承,则基类的保护成员在派生类中成为私有成员,可被派生类成员函数直接访问
在保护继承中,基类的公有成员在派生类中成为保护成员,基类的保护成员在派生类中仍为保护成员
保护成员不能直接被子类的对象访问
派生类直接访问基类的成员方法,
1,将基类中提供给派生类访问的私有成员定义为保护成员。
2,将需要访问基类私有成员的派生类成员函数声明为友元