一、实验内容
1.构造函数继承访问权限测试
(1)设计类A具有public, protected, private等不同属性的成员函数或变量; (2)类B通过public, protected, private等不同方式继承A,在类B的成员函数中测试访问A的成员函数或变量; (3)在类B中添加public, protected, private等不同属性的成员函数或变量,在外部测试访问B的各个成员函数或变量; (4)B以private方式继承A,尝试把A中的部分public成员提升为public。
2.友元类继承测试
(1)设计类A含有私有变量a,在类A中友元给类C; (2)设计类B继承A,添加私有变量b;在类C中测试访问类B的成员变量a, b; (3)设计类D继承C,在D的成员函数中测试访问类A的成员变量a,类B的成员变量a, b。
3.多态性综合运用
(1)一般多态性函数:输入输出参数完全一样,在父类中添加virtual; (2)特殊多态性函数:输入或输出参数在子类中是父类的指针或基类的引用,在子类中对于的是子类的指针或子类的引用; (3)析构函数的多态性; (4)多继承,注意什么情况需要虚继承; (5)设计矢量图,运用多继承设计组合图形,要求具备创建不同类型矢量图、选择图形、移动图形、用不同颜色显示图形(表示选中与否),用vector或数组管理图形。
二、实验过程和相关代码
1.构造函数继承访问权限测试
(1)设计父类Person类,其中变量 m_strName的属性是public, SetSex函数、变量m_strSex属性是protected, 变量m_nAge的属性为private。如下代码所示:
class Person
{
public:
Person();
string m_strName;
protected:
void SetSex(string strSex)
{
m_strSex=strSex;
}
string m_strSex;
private:
int m_nAge;
};
(2)子类通过public, protected, private等不同方式继承父类Person,在子类的成员函数中测试访问父类Person的成员函数或变量。 子类Student类通过public方式继承父类,代码如下:
class Student:public Person
{
public:
void SetSex(string strSex="")
{
m_strName="";
m_strSex=strSex;
}
inline string GetSex();
};
string Student::GetSex()
{
return m_strSex;
}
结果截图:
子类Teacher通过protected方式继承父类Person,代码如下:
class Teacher:protected Person
{
public:
void SetSex(string strSex="")
{
m_strName="";
m_strSex=strSex;
}
inline string GetSex();
};
改变Teacher类的属性为private,则此类中所有的均变成私有的,故在测试函数中是无法访问的。
class Teacher:private Person
{
public:
void SetSex(string strSex="")
{
m_strName="";
m_strSex=strSex;
}
inline string GetSex();
};
(3)所谓什么是外部什么是内部?外部即为main函数的操作,通过实验可知外部只能访问到public类别。 (4)Teacher以private方式继承Person,当属性为protected或者private的Teacher类,在main函数进行外部访问时,却访问不到原本为公有状态的变量函数了。 如下图:m_nAge等变量均访问不了,如何解决此问题呢? 解决方法如下图所示:在Teacher类中using Person::m_strName; 相当于单独地把m_strName级别提升了。(本来是public因为把Teacher类改为private故也降级成private) 结果如下图所示:m_strName可以直接访问了。而m_nAge和m_strSex未这样操作,故依然锁着。 在继承类中,只能访问到基类的protected和public属性。
2.友元类继承测试
(1)Person类含有私有变量m_nAge,在类Person中友元给类Teacher。 (2)设计类Student继承Person,添加私有变量m_stuAge(学习年数);在类Teacher中测试访问类Student 的成员变量m_Age,m_stuAge。
class Person
{
public:
Person();
string m_strName;
protected:
void SetSex(string strSex)
{
m_strSex=strSex;
}
string m_strSex;
private:
int m_nAge;
private:
int m_nAge;
friend class Teacher;
friend void A::TestFriend(Person & per);
friend void TestFriendFun(Person &per)
{
per.m_nAge=10;
}
};
class Teacher:private Person
{
public:
using Person::m_strName;
void SetSex(string strSex="")
{
m_strName="";
m_strSex=strSex;
}
inline string GetSex();
int GetAge()
{
m_nAge=10;
}
void TestFriendstu(Student stu)
{
stu.m_nAge;
}
private:
int m_workAge;
};
如上图可知:Teacher类可以访问Student成员变量m_nAge,但是不能访问m_stuAge。
(3)设计类Lecturer(讲师)继承Teacher(教师),在Lecturer的成员函数中测试访问类Person类的成员变量m_nAge,类Student的成员变量stu.m_nAge, stu.m_stuAge。
3.多态性综合运用
(1)一般多态性函数:输入输出参数完全一样,在父类中添加virtual; (2)特殊多态性函数:输入或输出参数在子类中是父类的指针或基类的引用,在子类中对于的是子类的指针或子类的引用; (3)析构函数的多态性; (4)多继承,注意什么情况需要虚继承; (5)设计矢量图,运用多继承设计组合图形,要求具备创建不同类型矢量图、选择图形、移动图形、用不同颜色显示图形(表示选中与否),用vector或数组管理图形。
实验总结
1.构造函数继承访问权限测试
(1)在内部,即为继承类的成员函数内部,所能访问的是基类里面protected以上级别的属性,而private属性都没办法访问。 (2)在外部,即main函数,只能访问到public属性。 (3)继承类如果使用public,那么基类里原来是什么属性,现在依然是什么属性。 (4)继承类如果使用protected,那么所有都会降级别到protected属性,这个意思就是当你用protected继承,那么外部都没办法访问到基类里面的成员函数和变量。 (5)继承类如果使用private,那么所有都会降级别到private属性。 (6)降级后,如果依然要使用降级后的变量,可以使用using 方法。
2.友元类继承测试
如果,变量本身级别就很低,跟降不降级没啥关系,即使没降级也是不能访问的,例如private属性的变量。那么此时用友元。 有三类:
3.多态性综合运用
(1)一般多态性函数:输入输出参数完全一样,在父类中添加virtual; (2)特殊多态性函数:输入或输出参数在子类中是父类的指针或基类的引用,在子类中对于的是子类的指针或子类的引用; (3)析构函数的多态性; (4)多继承,注意什么情况需要虚继承; (5)设计矢量图,运用多继承设计组合图形,要求具备创建不同类型矢量图、选择图形、移动图形、用不同颜色显示图形(表示选中与否),用vector或数组管理图形。
|