基类和派生类访问属性总结
代码写的不好,没去修改了,但是能够阐明这个原理:
#include <iostream>
#include <string>
using namespace std;
/*
父类的成员属性按照是否可以被派生类访问总共可以分为两种:
1)public、protected
2)private
第一种可以被派生类访问,在派生类中的属性根据以何种方式继承,
派生类中的属性决定了类使用者的使用权限。
第二种派生类无论如何都访问不了,更不用说类使用者了
从本例得出的结论:定义基类的时候,想要被继承的东西就不要
设置成私有属性
*/
class CAnimal
{
public:
typedef enum _kind{
acquatic, //水生
terrestrial, //陆生
no_kind //
}kind;
typedef enum _mov_way{
fly,
swim,
walk
}mov_way;
public:
CAnimal(){}
string get_name()const
{
return name;
}
private:
int lifespan; //寿命
public:
bool bEatable; //是否可以食用
string name; //动物的名字
protected:
bool bRare; //稀有的
};
/*
*公有继承模式下,子类不能访问父类的private成员,
*其它的成员按原来的属性继承下来
*/
class CBird : public CAnimal
{
public: CBird():m(fly),k(terrestrial){
name = "bird"; //正确,可以访问父类的公有成员
bEatable = true; //正确,可以访问父类的公有成员
//lifespan = 10; //错误,公有继承不能访问父类的私有成员--因此,想要被继承的东西就不要设为私有
bRare = false;//正确,可以访问父类的保护成员
}
private:
string feather_colr; //羽毛颜色
public:
CAnimal::kind k;
CAnimal::mov_way m;
};
/*
*保护继承模式下父类的成员属性从public和protected全部变成
*protected属性
**/
class CFish : protected CAnimal
{
public: CFish():k(acquatic), m(swim){
name = "fish"; //正确,可以访问父类的公有成员
bEatable = true; //正确,可以访问父类的公有成员
//lifespan = 20; //错误,公有继承不能访问父类的私有成员--因此,想要被继承的东西就不要设为私有
bRare = false;//正确,可以访问父类的保护成员
}
public:
CAnimal::kind k;
CAnimal::mov_way m;
};
/*
*私有继承模式下父类的所有成员属性从全部变成
*private属性
**/
class CMammal : private CAnimal
{
public: CMammal():k(terrestrial), m(walk){
name = "mammal"; //正确,可以访问父类的公有成员
bEatable = true; //正确,可以访问父类的公有成员
//lifespan = 30; //错误,公有继承不能访问父类的私有成员--因此,想要被继承的东西就不要设为私有
bRare = false;//正确,可以访问父类的保护成员
}
friend void FUNC(CMammal & animal);
public:
CAnimal::kind k;
CAnimal::mov_way m;
};
void FUNC(CMammal & animal)
{
animal.name = "mammal";
animal.bEatable = true;
animal.bRare = false;
//animal.lifespan = 30;
}
int main()
{
//公有继承
CBird bird;
bird.name = "maque";//正确,在子类中为公有
//bird.bRare = false; //错误,在子类中为受保护
//bird.lifespan = 10; //错误,基类的私有成员完全不能访问
//保护继承
CFish fish;
//fish.name = "fish"; //错误,在子类中为受保护
//fish.bRare = false; //错误,在子类中为受保护
//fish.lifespan = 20; //错误,基类的私有成员完全不能访问
//私有继承
CMammal mammal;
//mammal.name = "manmal";//错误,在子类中为私有
//mammal.bRare = false; //错误,在子类中为私有
//mammal.bEatable = true;//错误,基类的私有成员完全不能访问
return 0;
}
列表总结如下: