6.C++:继承

一、继承

//1.类中的保护和私有在当前类中没有差别;

//2.在继承后的子类中有差别,private在子类中不可见,所以用protected;

class person
{
public:
    void print()
    {
        cout << "name:" << _name << endl;
        cout << "age:" << _age << endl;
    }
protected:     //若换为private,则执行错误
    string _name = "peter";
    int _age = 18;
};

class student: public person
{
protected:
    int stuid;
};
int main()
{
    student s;
    s.print();
    return 0;
}

二、 基类和派生类对象赋值转换

class person
{
protected:
    string _name;
    string _sex;
    int _age;
};
class student: public person
{
protected:
    int stuid;
};
int main()
{
    person p;
    student s;
    //子类和父类之间的赋值兼容规则
    //1.子类对象可以赋值给父类对象/指针/引用
    p = s;
    person* ptr = &s;
    person& ref = s;
    //反过来
    s = p;     //不可以
    student* ptr = &p; //有时候可以
    student& ref = p;
    return 0;
}

指针ptr指向student类中父类的那一部分;

引用ref是子类student中父类那一部分的别名; 


三、继承中的作用域

class person
{
protected:
    string _name = "peter";
    int _num = 111;
};
class student: public person
{
public:
    void print()
    {
        cout << "姓名:" << _name << endl;
        cout << "学号:" << _num << endl;
    }
protected:
    int _num = 999;
};
int main()
{
    student s;
    s.print();   
    return 0;
}
//输出: 姓名:peter
       // 学号:999

//1.两个_num在不同的作用域中,一个在父类,一个在子类,不会报错;

//2.当父类和子类同时有同名成员时,子类的成员隐藏于父类的成员(重定义);

//优先访问子类,现在子类中找,再去父类;

 访问父类_num:

class person
{
protected:
    string _name = "peter";
    int _num = 111;
};
class student: public person
{
public:
    void print()
    {
        cout << "姓名:" << _name << endl;
        cout << "学号:" << _num << endl;
        cout << "学号:" << person::_num << endl; //指定作用域即可
    }
protected:
    int _num = 999;
};
int main()
{
    student s;
    s.print();
    return 0;
}

 //1.A和B的fun构成什么关系?

//重定义(隐藏),不是重载,重载必须在同一个作用域

//函数只要函数名相同,不需要参数相同

class A
{
public:
    void fun()
    {
        cout << "func()" << endl;
    }
};
class B : public A
{
public:
    void fun(int i)
    {
        A::fun();
        cout << "func(int i)->" << i << endl;
    }
};

int main()
{
    B b;
    b.fun(); //执行错误
    b.fun(123456);
    b.A::fun(); //调用A的fun()
    return 0;
}

四、派生类的默认成员函数

class Person
{
public:
    //1.构造函数
    Person(const char* name = "peter")
        : _name(name)
    {
        cout << "Person()" << endl;
    }
    //2.拷贝构造
    Person(const Person& p)
        : _name(p._name)
    {
        cout << "Person(const Person& p)" << endl;
    }
    //3.赋值
    Person& operator=(const Person& p)
    {
        cout << "Person operator=(const Person& p)" << endl;
        if (this != &p)
            _name = p._name;
        return *this;
    }
    //4.析构函数
    ~Person()
    {
        cout << "~Person()" << endl;
    }
protected:
    string _name;
};

class Student : public Person
{
public:
    Student(const char* name, int num)
        : Person(name) //调用父类的构造函数
        , _num(num)
    {
        cout << "Student()" << endl;
    }
    Student(const Student& s)
        : Person(s) //调用父类的拷贝构造
        , _num(s._num)
    {
        cout << "Student(const Student& s)" << endl;
    }
    Student& operator=(const Student& s)
    {
        if (this != &s)
        {
            Person::operator =(s);//重定义,调用父类的person::
            _num = s._num;
        }
        cout << "Student& operator= (const Student& s)" << endl;
        return *this;
    }
    ~Student()  
    {
       // Person::~Person();//与~Person()构成隐藏
        cout << "~Student()" << endl;//调用子类析构后会自动调用父类析构
    }
protected:
    int _num; //学号
};
int main()
{
    Student s1("peter",11);
    Student s2(s1);
    return 0;
}

//输出:

Person()   //父类构造
Student()  //子类构造
Person(const Person& p)  //父类拷贝构造
Student(const Student& s)  //子类拷贝构造
~Student()   //s2析构
~Person()    //子类调用析构,自动调用父类析构
~Student()  //s1析构
~Person()

int main()
{
    Student s1("peter",11);
    Student s3("rose",20);
    s1 = s3;
    return 0;
}

 //输出:

Person()  //s1构造
Student()
Person()  //s2构造
Student()
Person operator=(const Person& p)  //父类赋值
Student& operator= (const Student& s)  //子类赋值
~Student()  //s3析构
~Person()
~Student()  //s1析构
~Person()


如何设计一个不能被继承的类? 

构造函数私有化,不能被继承,对象无法生成

class A
{
private:
    A()
    {}
};
class B :public A
{};

五、友元与继承

友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员
class Student; //注意
class Person
{
public:
    friend void Display(const Person& p, const Student& s);
protected:
    string _name;
};
class Student : public Person
{
    friend void Display(const Person& p, const Student& s);
protected:
    int _stuNum; 
};

void Display(const Person& p, const Student& s)
{
    cout << p._name << endl;
    cout << s._stuNum << endl;
}
int main()
{
    Person p;
    Student s;
    Display(p, s);
    return 0;
}

 或者:

class Student;
class Person
{
protected:
    string _name;
};
class Student : public Person
{
    friend void Display(const Person& p, const Student& s);
protected:
    int _stuNum; 
};

void Display(const Person& p, const Student& s)
{
    cout << s._name << endl;
    cout << s._stuNum << endl;
}
int main()
{
    Person p;
    Student s;
    Display(p, s);
    return 0;
}

六、继承与静态成员

基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例 。
class Person
{
public:
    Person() 
    { 
        ++_count; 
    }
    string _name; 
    static int _count; 
};
int Person::_count = 0;
class Student : public Person
{
public:
    int _stuNum; 
};
int main()
{
    Person p;
    Student s;
    p._name = "jack";
    s._name = "rose";
    p._count = 1;
    s._count = 2;
    cout << Person::_count << endl;
    return 0;
}

_count放在静态区,只有一个_count,p和s中的_count是一个


七、复杂的菱形继承及菱形虚拟继承

单继承:一个子类只有一个直接父类时称这个继承关系为单继承
多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承
菱形继承:菱形继承是多继承的一种特殊情况

菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。

class Person
{
public:
    string _name; // 姓名
};
class Student : public Person
{
protected:
    int _num; //学号
};
class Teacher : public Person
{
protected:
    int _id; // 职工编号
};
class Assistant : public Student, public Teacher
{
protected:
    string _majorCourse; // 主修课程
};
void Test()
{
    // 这样会有二义性无法明确知道访问的是哪一个
    Assistant a;
    a._name = "peter";
    // 需要显示指定访问哪个父类的成员可以解决二义性问题,但是数据冗余问题无法解决
    a.Student::_name = "xxx";
    a.Teacher::_name = "yyy";
}

解决方法:

class Person
{
public:
    string _name; // 姓名
};
class Student : virtual public Person
{
protected:
    int _num; //学号
};
class Teacher : virtual public Person
{
protected:
    int _id; // 职工编号
};

virual分析:

 


八、继承和组合

//1.public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。
//2.组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。
//3.继承与组合都可以的情况下,优先使用对象组合,而不是类继承 。
// Car和BMW Car和Benz构成is-a的关系
class Car {
protected:
    string _colour = "白色"; // 颜色
    string _num = "陕ABIT00"; // 车牌号
};

class BMW : public Car {
public:
    void Drive() { cout << "好开-操控" << endl; }
};

class Benz : public Car {
public:
    void Drive() { cout << "好坐-舒适" << endl; }
};
// Tire和Car构成has-a的关系
class Tire {
protected:
    string _brand = "Michelin"; // 品牌
    size_t _size = 17; // 尺寸
};
class Car {
protected:
    string _colour = "白色"; // 颜色
    string _num = "陕ABIT00"; // 车牌号
    Tire _t; // 轮胎
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/554975.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《乱弹篇(29)崇州寻兰》

几天前天气骤然暴热&#xff0c;致使本老龄笔者血氧饱和度急剧下降至89&#xff0c;心率加速高达110至120&#xff0c;晚上盖床夏被也觉浑身燥热&#xff0c;很不舒服&#xff0c;彻夜难眠&#xff0c;便有一种“快走了”的不祥预感袭上心头。其实&#xff0c;我真的祈盼能心肌…

计算机视觉——基于OpenCV和Python进行模板匹配

模板匹配&#xff1f; 模板匹配是它允许在一幅较大的图像中寻找是否存在一个较小的、预定义的模板图像。这项技术的应用非常广泛&#xff0c;包括但不限于图像识别、目标跟踪和场景理解等。 目标和原理 模板匹配的主要目标是在一幅大图像中定位一个或多个与模板图像相匹配的…

隧道中心线提取

作者&#xff1a;迅卓科技 简介&#xff1a;本人从事过多项点云项目&#xff0c;并且负责的项目均已得到好评&#xff01; 公众号&#xff1a;迅卓科技&#xff0c;一个可以让您可以学习点云的好地方 重点&#xff1a;每个模块都有参数如何调试的讲解&#xff0c;即调试某个参数…

HackMyVM-BaseME

目录 信息收集 arp nmap WEB web信息收集 gobuster hydra 目录检索 ssh 提权 get user sudo base64提权 get root 信息收集 arp ┌─[rootparrot]─[~/HackMyVM] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168…

​波士顿动力发布全新人形机器人:Atlas

4月16日&#xff0c;波士顿动力&#xff08;Boston Dynamics&#xff09;发布了《再见&#xff0c;液压Atlas》视频&#xff0c;正式宣告其研发的液压驱动双足人形机器人Atlas退役。 在视频的结尾&#xff0c;Atlas深深鞠躬&#xff0c;之后还有一句话“直到我们再次相遇&…

ChatGPT及GIS、生物、地球、农业、气象、生态、环境科学领域案例

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

Count the Values of k

目录 题目总览 思路 参考代码 原题链接&#xff1a; CF1933C Turtle Fingers: Count the Values of k 题目总览 # Turtle Fingers: Count the Values of k ## 题面翻译 给你三个**正**整数 $a$ 、 $b$ 和 $l$ ( $a,b,l>0$ )。 可以证明&#xff0c;总有一种方法可以选择*…

如何用ChatGPT进行论文撰写?

原文链接&#xff1a;如何用ChatGPT进行论文撰写&#xff1f;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601619&idx1&snb686fbe87dedfac2df3a6afe780b2ffe&chksmfa820c34cdf5852251dca64597024ea62ddbde280086535ec251f4b62b848d9f9234688384e6…

【论文速读】| 大语言模型是边缘情况模糊测试器:通过FuzzGPT测试深度学习库

本次分享论文为&#xff1a;Large Language Models are Edge-Case Fuzzers: Testing Deep Learning Libraries via FuzzGPT 基本信息 原文作者&#xff1a;Yinlin Deng, Chunqiu Steven Xia, Chenyuan Yang, Shizhuo Dylan Zhang, Shujing Yang, Lingming Zhang 作者单位&…

js高级 笔记02

目录 01 object提供的一些静态方法 02 词法作用域 03 作用域链 04 arguments的使用 05 开启严格模式 06 高阶函数 07 闭包 01 object提供的一些静态方法 Object.create() 对象继承 Object.assign(对象1,对象2) 对象合并 可以将对象2 里面的可枚举属性和自身的属性合并到…

C语言简单的数据结构:单链表的有关算法题(2)

题目&#xff1a; 4. 单链表相关经典算法OJ题3&#xff1a;合并两个有序链表5. 循环链表经典应⽤-环形链表的约瑟夫问题6. 单链表相关经典算法OJ题5&#xff1a;分割链表 接着我们介绍后面的三道题&#xff0c;虽然代码变多了但我们的思路更加通顺了 4. 单链表相关经典算法OJ题…

前端请求404,后端保无此方法

1、微信小程序前端路径404 2、后端报无此路径 3、查看路径下对应的方法 发现忘了在list方法前加GetMapping(“/list”)&#xff0c;加上即可

Python用于创建和可视化环形图的工具库之pycirclize使用详解

概要 Python pycirclize库是一个用于创建和可视化环形图的工具,它提供了丰富的特性和功能,可以帮助用户展示环形结构数据的关系和比例。本文将深入探讨pycirclize库的安装、特性、基本功能、高级功能、实际应用场景等方面。 安装 安装pycirclize库非常简单,可以通过pip命令…

2024年华中杯数学建模竞赛全攻略:ABC题思路解析+代码实现+数据集+论文撰写+全程答疑

引言 &#xff08;比赛后所有题目资料在文末获取呀&#xff09; 华中杯数学建模竞赛是数学建模领域的一项重要赛事&#xff0c;它不仅考验参赛者的数学建模能力&#xff0c;还考验了编程技能、数据分析能力和论文撰写能力。为了帮助参赛者更好地准备2024年的竞赛&#xff0c;本…

记一次webshell排查但又无webshell的应急

某次应急中&#xff0c;客户吓坏了&#xff0c;说是内网流量分析设备中有很多webshell连接告警&#xff0c;作为一名卑微但又不失理想的安服仔&#xff0c;毅然直奔前线… 过程 去到现场后&#xff0c;直接打开客户的流量分析设备&#xff0c;的确看到一堆冒红的webshell连接…

【Java开发指南 | 第十二篇】Java循环结构

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 循环1、while循环2、do-while循环3、for循环 break 关键字数组for循环continue 关键字 循环 与C语言相同&#xff0c;Java中有三种主要的循环结构&#xff1a; while 循环do…while 循环for 循环 1、while循…

python二级题目-仅使用 Python 基本语法,即不使用任何模块,编写 Python 程序计算下列数学表达式的结果并输出,小数点后保留 3 位。

x(((3**4)5*(6**7))/8)**0.5 .format 用法一&#xff1a; print({}.format(1)) 1 print(这个是format的用法{}。。。.format(3)) 这个是format的用法3 ’大括号1:{},大括号2:{},大括号3:{}‘.format(3,4,5) print(’大括号1:{},大括号2:{},大括号3:{}‘.form…

内业减少80%人工操作,林地地形轻松测!

林业作为维护生态平衡和保护环境的关键领域&#xff0c;其科学管理和合理利用是当前林业工作的重中之重。林业调查旨在全面了解当前林业资源的状况&#xff0c;其中林地地形测量是林业调查的基础工作。通过对林地地形的准确测量&#xff0c;可获取森林的地理位置、面积、地貌、…

(CVPR,2024)CAT-Seg:基于成本聚合的开放词汇语义分割

文章目录 摘要引言方法计算成本与嵌入空间成本聚合类别成本聚合CAT-Seg框架 实验 摘要 开放词汇的语义分割面临着根据各种文本描述对图像中的每个像素进行标记的挑战。在这项工作中&#xff0c;我们引入了一种新颖的基于成本的方法&#xff0c;以适应视觉语言基础模型&#xf…

设计模式———单例模式

单例也就是只能有一个实例&#xff0c;即只创建一个实例对象&#xff0c;不能有多个。 可能会疑惑&#xff0c;那我写代码的时候注意点&#xff0c;只new一次不就得了。理论上是可以的&#xff0c;但在实际中很难实现&#xff0c;因为你无法预料到后面是否会脑抽一下~~因此我们…