IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++实验二 继承和多态 -> 正文阅读

[C++知识库]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;
(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或数组管理图形。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 14:45:41  更:2021-10-24 14:47:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:21:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码