栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++实验2 继承和多态

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++实验2 继承和多态

一、继承访问权限测试 1.目标

设计类A具有public, protected, private等不同属性的成员函数或变量;
类B通过public, protected, private等不同方式继承A,在类B的成员函数中测试访问A的成员函数或变量;
在类B中添加public, protected, private等不同属性的成员函数或变量,在外部测试访问B的各个成员函数或变量;

2.函数实现

类 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];
    }
}


 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429889.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号