C++学习路线(二十七)

虚基类

菱形继承的重大缺点

#include <iostream>
using namespace std;class Tel { // 电话类
public:Tel() {this->number = 0;}
protected:int number;
};class FixLine : public Tel { // 固定电话类
};class MobilePhone : public Tel { // 移动电话类
};
//无线座机
class WirelessLine : public MobilePhone, public FixLine{ // 无线电话类
public:void setNumber(int num) {this->Tel::number = num;}int getNumber() {return this->Tel::number;}};
int main() {return 0;
}

比如说FixLine,继承于Tel MobilePhone也继承于Tel 那么如果调用number 就会报错

这种情况可以使用虚继承和虚基类进行解决。

#include <iostream>
using namespace std;class Tel { // 电话类
public:Tel() {this->number = 0;}
protected:int number;
};class FixLine : virtual public Tel { // 固定电话类};class MobilePhone : virtual public Tel { // 移动电话类};
//无线座机
class WirelessLine : public MobilePhone, public FixLine{ // 无线电话类
public:void setNumber(int num) {this->number = num;}int getNumber() {return this->number;}};
int main() {return 0;
}

之前的相亲项目的改造

对Girl类和Boy类进行重构:

  1. 抽取出共同的方法和数据成员, 用来构建一个新的基类[父类]
  2. Girl和Boy类修改为从Human类继承,并修改相关代码。

Human.h

#pragma once
#include <string>
class Humans {
public:Humans(std::string name, int age) :   name(name), age(age) {}int getAge() const;std::string getName() const;std::string Description() const;
private:std::string name;int age;
};

Human.cpp

#include "Human.h"
#include "sstream"
Humans::Humans(std::string name, int age)
{this->name = name;this->age = age;
}
int Humans::getAge() const {return age;
}
std::string Humans::getName() const {return name;
}
std::string Humans::Description() const {std::stringstream ss;ss << "Name: " << name << ", Age: " << age;return ss.str();
}

boy.h

#pragma once
#include <string>
#include <vector>
#include "../继承/Human.h"
class Girl;class Boy : public Humans {
public:Boy(std::string name, int age, int salary);std::string Description() const;int getSalary() const;bool satisfy(const Girl& other);static void inputsBoys(std::vector<Boy>& boys);
private:int salary;
};

boy.cpp

#include <sstream>
#include <string>
#include "boy.h"
#include "girl.h"#define SALARY_FACTOR 0.005Boy::Boy(std::string name, int age, int salary) : Humans(name, age) , salary(salary) {}
int Boy::getSalary() const {return salary;
}
std::string Boy::Description() const {std::stringstream ss;ss << getName() << "工资" << salary << " 年龄" << getAge();return ss.str();
}
void Boy::inputsBoys(std::vector<Boy>& boys) {int n = 1;std::string name;int age;int salary;while (1) {std::cout << "请输入第" << n << "位男孩的信息(输入0结束输入):" << std::endl;std::cout << "年龄:" << std::endl;std::cin >> age;if (age == 0) break;std::cout << "姓名:" << std::endl;std::cin >> name;std::cout << "工资:" << std::endl;std::cin >> salary;boys.push_back(Boy(name, age, salary));n++;}
}bool Boy::satisfy(const Girl& girl) {if (girl.getBeauty() >= salary * SALARY_FACTOR) {return true;}else return false;
}

girl.h

#pragma once
#include <iostream>
#include <string>
#include <vector>
#include "../继承/Human.h"
class Boy;class Girl : public Humans {
public:Girl(std::string name, int age, int beauty);std::string Description() const;int getBeauty() const;bool satisfy(const Boy& boy) const;static void inputsGirls(std::vector<Girl>& girls);
private:int beauty;
};

girl.cpp

#include "girl.h"
#include "boy.h"
#include <string>
#include <sstream>#define YANZHI_FACTOR 1.1Girl::Girl(std::string name, int age, int beauty) : Humans(name, age), beauty(beauty) {}
int Girl::getBeauty() const {return beauty;
}
std::string Girl::Description() const {std::stringstream ss;ss << getName() << "颜值" << beauty << " 年龄" << getAge();return ss.str();
}
bool Girl::satisfy(const Boy& boy) const {if(boy.getSalary() >= beauty * YANZHI_FACTOR) return true;return false;
}
void Girl::inputsGirls(std::vector<Girl>& girls) {int age;std::string name;int beauty;int n = 1;while (1) {std::cout << "请输入第" << n << "位女孩的信息(输入0结束输入):" << std::endl;std::cout << "年龄:" << std::endl;std::cin >> age;if (age == 0) break;std::cout << "姓名:" << std::endl;std::cin >> name;std::cout << "颜值:" << std::endl;std::cin >> beauty;n++;girls.push_back(Girl(name, age, beauty));}
}

main.cpp不变


常见错误总结

默认访问权限和语法要求

默认访问权限是private

访问权限之后一定要加冒号:

指定为某种访问权限之后, 就一直是这种权限, 除非再次指定为其他权限.

class MyClass{void func(); // private
}

类的成员的访问权限, 与继承方式的区别

相同点:都有public,  private, protected

不同点:意义完全不同。

小结:

成员的访问权限:

public,  可以通过外部来访问(通过对象直接访问), 类似于C语言结构体中的成员

private, 只能在内部访问(在这个类的成员函数内访问),但是在子类的内部不能直接访问。

protected, 只能在内部访问,而且可以在子类的内部直接访问。

继承方式:

public, 父类成员, 被继承到子类后,访问权限都不变。

private, 父类成员, 被继承到子类后,访问权限都变为private

protected, 父类成员, 被继承到子类后,public权限的成员,降级为protected, 其他不变。

项目扩展-位图算法

问题:

有很多不重复的整数, 其中最大值不超过40亿, 最小值是0.

要求判断某个指定的整数, 是否在这个集合中.

#include <iostream>
using namespace std;void init(char* data, int len) {unsigned int n = len * 8;for (int i = 0; i < n; i++) {if (i % 3 == 0) {cout << i << " ";char* p = data + i / 8;*p |= (1 << (i % 8));}}cout << endl;
}bool check(char* data, int value) {char* p = data + value / 8;bool ret =  *p & (1 << (value % 8));return ret;
}int main() {unsigned int n = 400;int len = n / 8 + 1;char* data = (char*)malloc(len);memset(data, 0, len);init(data, len);while (1) {int value;cin >> value;if (value == -1) break;if (check(data, value)) cout << "1" << endl;else cout << "0" << endl;}free(data);return 0;
}

项目练习一-练习一

定义一个类Book, 用来描述新书, 具有以下功能:
查看当前价格.

查看当前的书号

定义一个类SellBook, 用来表示促销的书籍, 要求继承自Book

具有以下功能:

  1. 查看当前折扣
  2. 设置当前折扣
  3. 查看当前的促销价

Book.h

#pragma once
#include <iostream>
#include <string>
class Book {
public:Book(float price, std::string isbn);~Book();float getPrice() const;std::string getISBN() const;
protected:double price;std::string isbn;
};

Book.cpp

#include "Book.h"Book::Book(float price, std::string isbn) {this->price = price;this->isbn = isbn;
}Book::~Book() {}float Book::getPrice() const {return price;
}
std::string Book::getISBN() const {return isbn;
}

SellBook.h

#pragma once
#include "Book.h"
class SellBook : public Book {
public:SellBook(float price, std::string isbn, float discount);~SellBook();float getPrice() const;float getDiscount() const;
private:float discount;
};

SellBook.cpp

#include "SellBook.h"SellBook::SellBook(float price, std::string isbn , float discount) : Book(price, isbn), discount(discount){}
SellBook::~SellBook(){}float SellBook::getPrice() const {return price * discount / 10.0;
}
float SellBook::getDiscount() const {return discount;
}

main.cpp

#include <iostream>
#include "Book.h"
#include "SellBook.h"
using namespace std;int main()
{Book b1(30, "123-123");SellBook sb1(30, "456-456", 5);cout << "Book price: " << b1.getPrice() << endl;cout << "SellBook price: " << sb1.getPrice() << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为原生鸿蒙操作系统的发布有何重大意义和影响:

#1024程序员节 | 征文# 一、华为原生鸿蒙操作系统的发布对中国的意义可以从多个层面进行分析&#xff1a; 1. 技术自主创新 鸿蒙操作系统的推出标志着中国在操作系统领域的自主创新能力的提升。过去&#xff0c;中国在高端操作系统方面依赖于外国技术&#xff0c;鸿蒙的发布…

outlook创建新账户时报错2603、2604的解决办法

全新的戴尔笔记本电脑&#xff0c;自带的Win11家庭版&#xff0c;安装ms office 2021也顺利完成。 但是奇怪的是&#xff0c;只有其中一台笔记本电脑&#xff0c;OUTLOOK无法添加新账户。 但是这个账号在WEB端登录正常&#xff0c;由于是新入职的员工&#xff0c;根据以往经验&…

Python小白学习教程从入门到入坑------第十八课 异常模块与包【上】(语法基础)

一、异常 在Python中&#xff0c;异常&#xff08;Exception&#xff09;是一种用于处理在程序运行时可能发生的错误情况的机制 异常允许程序在检测到错误时不是简单地崩溃&#xff0c;而是能够优雅地处理这些错误&#xff0c;可能包括记录错误信息、清理资源、或者向用户提…

QT界面开发--我的第一个windows窗体【菜单栏、工具栏、状态栏、铆接部件、文本编辑器、按钮、主界面】

经过前面的铺垫&#xff0c;今天我们就开始我们图形化界面之旅了&#xff0c;我们的第一个窗体主要包括&#xff1a;菜单栏、状态栏、工具栏、铆接部件、还有Qt提供的一些主窗体的API。 第一部分&#xff1a;主界面(QMainWindow) 当创建好项目后&#xff0c;我们直接运行&…

logdata-anomaly-miner:一款安全日志解析与异常检测工具

关于logdata-anomaly-miner logdata-anomaly-miner是一款安全日志解析与异常检测工具&#xff0c;该工具旨在以有限的资源和尽可能低的权限运行分析&#xff0c;以使其适合生产服务器使用。 为了确保 logdata-anomaly-miner的正常运行&#xff0c;推荐安装了python > 3.6的…

Qt 文本文件读写与保存

Qt 文本文件读写与保存 开发工具&#xff1a;VS2013 QT5.8 设计UI界面&#xff0c;如下图所示 sample7_1QFile.h 头文件&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample7_1QFile.h"class sample7_1QFile : public QMainWin…

中国人寿财险青岛市分公司:保障民生,传递关爱

中国人寿财险青岛市分公司以保障民生为使命&#xff0c;传递关爱与温暖。 在健康险领域&#xff0c;公司为市民提供全面的医疗保障。从重大疾病保险到普通医疗保险&#xff0c;满足不同客户的需求。通过与医疗机构合作&#xff0c;为客户提供便捷的就医服务和理赔服务&#xf…

Linux下的文件IO操作

目录 1.前导 1.1文件知识 1.2对比一下文件操作和重定向 1.2.1输入重定向 1.2.2追加重定向 1.3当前路径 1.4stdin stdout stderr 2.文件操作的系统调用接口 2.1.open()打开文件 2.1.2.flags参数 2.1.3.mode参数 2.1.3 umask()函数 2.2.write()向文件写入 ​编辑 2…

【Kaggle | Pandas】练习1:创造、阅读和写作

文章目录 1. 创建DataFrame2. 创建数据表3. 创建可变Series表4. 读取csv 数据集5. 保存csv 文件 1. 创建DataFrame 在下面的单元格中&#xff0c;创建一个 DataFrame fruits &#xff0c;如下所示&#xff1a; import pandas as pd # Your code goes here. Create a datafr…

Javaee---多线程(一)

文章目录 1.线程的概念2.休眠里面的异常处理3.实现runnable接口4.匿名内部类子类创建线程5.匿名内部类接口创建线程6.基于lambda表达式进行线程创建7.关于Thread的其他的使用方法7.1线程的名字7.2设置为前台线程7.3判断线程是否存活 8.创建线程方法总结9.start方法10.终止&…

Spring《声明式事务》

知识点&#xff1a; Spring 声明式事务 1.基于注解和配置类的Spring-jdbc环境搭建 1. 准备项目&#xff0c;pom.xml <dependencies> <!--spring context依赖--> <!--当你引入Spring Context依赖之后&#xff0c;表示将Spring的基础依赖引入了--> …

七款主流图纸加密软件强力推荐|2024年CAD图纸加密保护指南

在当今信息化的设计行业&#xff0c;保护CAD图纸的知识产权和数据安全变得尤为重要。随着越来越多的企业采用数字化设计和共享文件&#xff0c;如何防止CAD图纸被未经授权的访问和窃取成为了许多设计师和企业关注的焦点。为此&#xff0c;选用合适的图纸加密软件是保护CAD文件安…

《数据结构》学习系列——树(下)

系列文章目录 目录 树和森林的遍历树的遍历森林的遍历基本算法递归先根遍历树迭代先根遍历树树和森林的层次遍历 压缩与哈夫曼树文件编码扩充二叉树哈夫曼树和哈夫曼编码哈夫曼树的基本思路哈夫曼编码 树和森林的遍历 树的遍历 先根遍历&#xff1a;先访问树的根结点&#x…

想作弊❓用这个发起考试,根本没法作弊

&#x1f389; 推荐一款超实用的在线考试神器 —— 土著刷题✨ 如果你正在寻找一个既方便又高效的在线考试平台&#xff0c;那么“土著刷题”小&#x1f34a;序绝对值得一试&#xff01;它不仅完全免费&#xff0c;而且操作简单&#xff0c;非常适合用来组织线上测试。 &#x…

使用Angular构建动态Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Angular构建动态Web应用 1 引言 2 Angular简介 3 安装Angular 4 创建Angular项目 5 设计应用结构 6 创建组件 7 …

「Java SPI机制应用快速入门」: 一种JDK内置的服务提供发现机制

文章目录 什么是SPISPI机制的应用使用方法使用规范 入门案例 什么是SPI SPI首先是一种机制&#xff0c;这个机制叫&#xff1a;服务提供发现机制。那是谁来负责发现呢&#xff1f;当然是JDK内置的服务帮助我们发现啦。发现了帮助我们去调用&#xff0c;我们要做的就是在中间去…

2024护理类科技核心期刊汇总(最新版)

2024年9月中国科技核心期刊目录&#xff08;2024年版&#xff09;正式公布&#xff0c;13本护理类期刊入选。常笑医学整理了这13本护理类科技核心期刊的详细参数&#xff0c;以及投稿经验&#xff0c;供大家在论文投稿时参考&#xff0c;有需要的赶紧收藏&#xff01; 1.《中华…

SwiftUI(四)- 布局(VStack、HStack、ZStack)

引言 页面的搭建和布局在应用开发中几乎占据了一半的代码量。定于iOS开发而言&#xff0c;相较于其它平台&#xff0c;UIKit的布局方式显得相对局限&#xff0c;通常只有绝对布局和相对布局两种方案。而在Flutter或者Android开发中&#xff0c;布局选项更为丰富&#xff0c;比…

【mod分享】极品飞车9冬日mod,支持光追,想体验一把冬天的Rockport市吗

各位好&#xff0c;今天小编给大家带来一款新的高清重置魔改MOD&#xff0c;本次高清重置的游戏叫《极品飞车9最高通缉》。 《极品飞车&#xff1a;最高通缉》作为一款2005年的游戏&#xff0c;《极品飞车&#xff1a;最高通缉》的画面效果还是可以的&#xff0c;效果全开之后…

【状态机DP】力扣1186. 删除一次得到子数组最大和

给你一个整数数组&#xff0c;返回它的某个 非空 子数组&#xff08;连续元素&#xff09;在执行一次可选的删除操作后&#xff0c;所能得到的最大元素总和。换句话说&#xff0c;你可以从原数组中选出一个子数组&#xff0c;并可以决定要不要从中删除一个元素&#xff08;只能…