c++实验二 继承和多态


一、实验内容

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值