文章目录
一、实验内容
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;
//m_nAge=100; 不可以访问父类的private,public和protected是可以的
}
inline string GetSex();//显式的内联函数 要把inline显示出来
};
string Student::GetSex()//显式的内联函数要把inline显示出来
{
//能否把inline的实现放到cpp文件里? 只能放在头文件
return m_strSex;
}
结果截图:
子类Teacher通过protected方式继承父类Person,代码如下:
//不管改成什么public或protected 内部依然可以访问父类的。但是对于外部是有区别的
class Teacher:protected Person
{
public:
void SetSex(string strSex="")//在头文件里实现即隐含的内联函数
{
m_strName="";
m_strSex=strSex;
//m_nAge=100; 不可以访问父类的private,public和protected是可以的
}
inline string GetSex();//显式的内联函数 要把inline显示出来
};
改变Teacher类的属性为private,则此类中所有的均变成私有的,故在测试函数中是无法访问的。
class Teacher:private Person
{
public:
void SetSex(string strSex="")//在头文件里实现即隐含的内联函数
{
m_strName="";
m_strSex=strSex;
//m_nAge=100; 不可以访问父类的private,public和protected是可以的
}
inline string GetSex();//显式的内联函数 要把inline显示出来
};
(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;//第一种:友元类。即让这个Person类的private私有变量,让这个Teacher类能够访问
//注意其他即使继承了Teacher,也不能访问到该私有变量,仅仅允许Teacher类访问。
friend void A::TestFriend(Person & per);//第二种:友元成员函数。仅允许A类的该函数访问到私有变量
friend void TestFriendFun(Person &per)//第三种:全局函数 要在这里实现
{
per.m_nAge=10;
}
};
class Teacher:private Person
{
public:
using Person::m_strName;//相当于单独地把m_strName级别提升了,(本来是public因为把Teacher类改为private故也降级成private。
void SetSex(string strSex="")//在头文件里实现即隐含的内联函数
{
m_strName="";
m_strSex=strSex;
//m_nAge=100; 不可以访问父类的private,public和protected是可以的
}
inline string GetSex();//显式的内联函数 要把inline显示出来
int GetAge()
{
m_nAge=10;
}
void TestFriendstu(Student stu)
{
stu.m_nAge;
//stu.m_stuAge; 访问不到
}
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关键字。
虚函数重写:虚函数的重写:派生类中有一个跟基类的完全相同虚函数(函数名、参数、返回值都相同),我们就称子类的虚函数重写了基类的虚函数。
虚函数的重写也叫作虚函数的覆盖。
class OneX
{
public:
virtual void Waaa(int)
{
cout << "111" << endl;
}
};
class TwoX : publ