一、继承访问权限测试 1.目标
设计类A具有public, protected, private等不同属性的成员函数或变量;
类B通过public, protected, private等不同方式继承A,在类B的成员函数中测试访问A的成员函数或变量;
在类B中添加public, protected, private等不同属性的成员函数或变量,在外部测试访问B的各个成员函数或变量;
类 A
class A
{
public:
int _a;
protected:
int _b;
private:
int _c;
};
类B们
//通过public方式继承A
class B1: public A
{
public:
void Test()
{
_a = 1;
_b = 2;
//_c = 3;
}
};
//通过protected方式继承A
class B2: protected A
{
public:
void Test()
{
_a = 4;
_b = 5;
//_c = 6;
}
};
//通过private方式继承A
class B3: private A
{
public:
void Test()
{
_a = 7;
_b = 8;
//_c = 9;
}
};
在外部测试访问B的各个成员函数或变量
int main()
{
B1 b1;
B2 b2;
B3 b3;
b1.Test();
b2.Test();
b3.Test();
cout<<"B1 "<
结果
结论
当子类对父类进行访问时,只可访问父类的public, protected;不能对private进行访问,若尝试进行访问private则会出现如下报错
使用外部函数时,只可访问public,其余会出现如下报错
二、友元类继承测试
1.设计类A含有私有变量a,在类A中友元给类C;
class A
{
public:
friend class C;
private:
int a;
};
2.设计类B继承A,添加私有变量b;
class B:public A
{
private:
int b;
}
3.在类C中测试访问类B的成员变量a, b;
class C
{
public:
int Test1(B b)
{
return b.a;
}
};
若朋友访问儿子的private,则会报错
结论:朋友不可访问儿子的protected以下级别,但可以访问从父类继承过来的protected以下级别
4.设计类D继承C,在D的成员函数中测试访问类A的成员变量a,类B的成员变量a, b。
class D:public C
{
public:
int Test1(A a)
{
return a.a;
}
int Test2(B b)
{
return b.a;
}
int Test3(B b)
{
return b.b;
}
};
结果全部报错
结论:朋友的儿子不可访问protected以下级别
三、多态性综合运用
一般多态性函数:输入输出参数完全一样,在父类中添加virtual;
特殊多态性函数:输入或输出参数在子类中是父类的指针或基类的引用,在子类中对于的是子类的指针或子类的引用;
class CAnimal
{
public:
CAnimal(int nLeg);
~CAnimal();
virtual void Move();
protected:
int m_nLegs;
};
class CCat: virtual public CAnimal
{
public:
CCat(int nLegs);
~CCat();
void Move();
};
class CEagle: virtual public CAnimal
{
public:
CEagle(int nLegs);
~CEagle();
void Move();
};
class COwl : public CCat, public CEagle
{
public:
COwl(int nLegs);
~COwl();
void Move();
};
void callMove(Canimal& an){
an.Move();
}
void callMove(Canimal* pAn){
pAn->Move();
}
void TestAnimal()
{
CAnimal animale(0);
CCat cat(4);
CEagle eagle(2);
COwl owl(2);
owl.Move();
owl.CCat::Move();
CAnimal * pAnimal[4];
pAnimal[0] = new CAnimal(4);
pAnimal[1] = new CCat(4);
pAnimal[2] = new CEagle(2);
pAnimal[3] = new COwl(2);
for(int i=0;i<4;i++)
{
pAnimal[i]->Move();
}
for(int i=0;i<4;i++)
{
delete pAnimal[i];
}
}



