c++类的继承和派生、继承和访问权限、子类的构造函数、子类型、二义性问题、多重继承、虚基类、以及常见错误

news2024/9/30 23:39:52

继承和派生

现实写照

 父亲“派生”出儿子

儿子“继承”自父亲

派生和派生,本质是相同的,只是从不同的角度来描述。

继承和派生在UML 中的表示

注意是“空心三角箭头”,从子类【派生的类】指向父类【被继承的类】

父类,也称为“基类”

除了“构造函数”和“析构函数”

父类的所有成员函数,以及数据成员,都会被子类继承!

 

代码实现

 Son.h

#pragma once
#include "Father.h"
#include <iostream>
class Son :public Father{
public:
	Son(const char* name,int age ,const char*game);
	Son();
	string description();
	~Son();
	string getGame();
private:
	string game;
};

son.cpp

#include "Son.h"
#include "Father.h"
#include <sstream>
//创建son对象时候,会调用构造函数!
//会调用父类的构造
//再调用自己的构造函数
Son::Son(const char* name, int age,const char*game) : Father(name, age)
{
	cout << __FUNCTION__ << endl;
	this->game = game;
	
	
}

Son::Son()
{
}

string Son::description()
{
	stringstream des;
	
	des << "name" << getName() << "age" << getAge() << "Game" << getGame();

	return des.str();
}

Son::~Son()
{
	cout << __FUNCTION__ << endl;
}

string Son::getGame()
{
	return game;
}

Father.h

#pragma once
#include <string>
using namespace std;
class Father
{
public:
	Father(const char* name,int age);
	~Father();
	Father();
	string getName();
	int getAge();
	string description();

private:
	string name;


	int age;
};

Father.cpp

#include "Father.h"
#include <sstream>
#include <iostream>	
Father::Father()
{

}

Father::Father(const char* name, int age)
{
	cout << __FUNCTION__ << endl;
	this->name = name;
	this->age = age;
}

Father::~Father()
{
}

string Father::getName()
{
	return string();
}

int Father::getAge()
{
	return 0;
}

string Father::description()
{
	stringstream des;
	des <<"name" << name << "Age" << age;
	return des.str();
}

 main.cpp

#include "Father.h"
#include "Son.h"

int main(void) {
	Father wjl("王健林", 68);
	Son wsc("王思聪", 32, "电竞");
	cout << wjl.description() << endl;
	//子类对象调用方法时 先在自己的定义中去寻找 如果有 ,就调用自己定义的 方法
	//如果找不到 就从父类的方法中去找 如果有 就调用这个方法
	cout << wsc.description() << endl;
	cout << wsc.getName() << "游戏:" << wsc.getGame() << endl;	
	system("pause");
	return 0;
}
 

// 子类的成员函数中, 不能访问从父类继承的private成员 可以使用protect

 子类对象调用方法时 先在自己的定义中去寻找 如果有 ,就调用自己定义的 方法
 如果找不到 就从父类的方法中去找 如果有 就调用这个方法

子类, 一般会添加自己的数据成员/成员函数,

或者, 重新定义从父类继承的方法!!! 子类对象就会调用自己重新定义的方法, 不会调用父类的同名方法

子类对象的分布

设置vs编译器:

在命令行中添加选项:(打印指定类的内存分布)

/d1 reportSingleClassLayoutFather /d1 reportSingleClassLayoutSon

 重新生成:

(x64)

x86  

cout << sizeof(wlj) << endl; // 32

cout << sizeof(yangGuo) << endl; // 60

 说明:成员函数,不占用对象的内存空间,但是也被子类继承了!!

protected 保护权限

为什么要使用protected保护权限

子类的成员函数中,不能直接访问父类的private成员,已经这些成员已经被继承下来了,但是却不能访问。

只有通过父类的public函数来间接访问,不是很方便。

比如,刚才Demo中Father类中的name和age成员。

解决方案:

把name和age定义为protected访问访问权限。

效果:

Son类的成员函数中,可以直接访问它的父类的protected成员。

但是在外部,别人又不能直接通过Son对象来访问这些成员。

一个类, 如果希望, 它的成员, 可以被自己的子类(派生类)直接访问,

但是, 又不想被外部访问那么就可以把这些成员, 定义为 protected访问权限!!!

 

 

访问权限总结:

public

外部可以直接访问.

可以通过对象来访问这个成员

private

外部不可以访问

自己的成员函数内, 可以访问

Father内的所有成员函数内, 可以直接访问name

protected

protected和private非常相似

和private的唯一区别:

protecte: 子类的成员函数中可以直接访问

private: 子类的成员函数中不可以访问

派生和继承的各种方式

  • (公有)继承[使用最频繁]

父类中定义的成员(数据成员和函数成员)被继承后,访问权限不变!

public --> public

protected --> protected

private --> private

  • (私有)继承

父类的成员(数据成员和函数成员)被继承后,访问权限变为private

public --> private

protected --> private

private --> private

  • (保护继承)

    public --> protected

    protected --> protected

    private --> private

小结:

public 继承全不变

private继承全变私

protected继承只把public降级为protected

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux后端服务器开发】Reactor模式实现网络计算器

目录 一、Reactor模式概述 二、日志模块&#xff1a;Log.hpp 三、TCP连接模块&#xff1a;Sock.hpp 四、非阻塞通信模块&#xff1a;Util.hpp 五、多路复用I/O模块&#xff1a;Epoller.hpp 六、协议定制模块&#xff1a;Protocol.hpp 七、服务器模块&#xff1a;Server.…

java实现钉钉群机器人@机器人获取信息后,机器人回复(机器人接收消息)

1.需求 鉴于需要使用钉钉群机器人回复&#xff0c;人们提出的问题&#xff0c;需要识别提出的问题中的关键词&#xff0c;后端进行处理实现对应的业务逻辑 2.实现方式 用户群机器人&#xff0c;附带提出的问题&#xff0c;后端接收消息后识别消息内容&#xff0c;读取到关键…

G-channel 实现低光图像增强

G-channel 之前研究低光图像增强时&#xff0c;看到一篇博客&#xff0c;里面介绍了一种方法&#xff0c;没有说明出处&#xff0c;也没有说明方法的名字&#xff0c;这里暂时叫做 G-channel 算法。 博客地址&#xff1a;低照度图像增强&#xff08;附步骤及源码&#xff09;…

VS2019/2022 开发CAD ObjectArx 2016

开发版本配置图 ObjectARX开发VC版本对照表R14~AutoCAD2024 下载地址 Visual Studio 2012/2013下载地址 CAD 版本Wizard和SDK安装包 ObjectARX官方下载地址(不定期更新) 序言 写这篇文章是想记录一下我的配置历程&#xff0c;因为我的电脑C盘空间不足以安装太多的CAD版本和…

详解AMQP协议

目录 1.概述 1.1.简介 1.2.抽象模型 2.spring中的amqp 2.1.spring amqp 2.2.spring boot amqp 1.概述 1.1.简介 AMQP&#xff0c;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议。 百度百科上的介绍&#xff1a; 一个提供统一消息服务的应用层标准高…

爬虫---练习源码

选取的是网上对一些球员的评价&#xff0c;来评选谁更加伟大一点 import csv import requests import re import timedef main(page):url fhttps://tieba.baidu.com/p/7882177660?pn{page}headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53…

Python:判断一个数是否为质数或者输出100以内的质数

质数 质数又称素数。一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数。 如&#xff1a;2&#xff0c;3&#xff0c;5&#xff0c;7。。。 判断一个数是否为质数 range(2, n)&#xff1a;范围在2~n&#xff08;不包括n&#xff09;之…

Mock.js的基本使用方法

官网网址&#xff1a;Mock.js (mockjs.com) 当前端工程师需要独立于后端并行开发时&#xff0c;后端接口还没有完成&#xff0c;那么前端怎么获取数据&#xff1f; 这时可以考虑前端搭建web server自己模拟假数据&#xff0c;这里我们选第三方库mockjs用来生成随机数据&#xf…

Java阶段五Day16

Java阶段五Day16 文章目录 Java阶段五Day16问题解析启动servlet冲突问题nacos注册中心用户信息验证失败前端效果不对前端请求到后台服务的流转过程 远程dubbo调用业务需求dubbo配置xml配置domain层代码 补充远程调用 师傅详情接口抽象开发WorkderServerControllerWorkerServerS…

一百四十二、Linux——查看Linux服务器架构的版本类型

一、目的 查看已经安装好的Linux服务器架构的版本类型&#xff0c;看服务器版本是32位还是64位 而且可以区分出是kettle的文件x86或x86_64&#xff0c;x86是32位&#xff0c;而x86_64是64位 注意&#xff1a; 32位的查询结果为i386、i686 64位的查询结果为x86_64 二、Linu…

idea配置docker部署

安装docker插件 setting -> plugins 配置docker远程连接 参考&#xff1a;docker配置远程连接端口 https://blog.csdn.net/jinying_51eqhappy/article/details/132103423?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%221…

探索CSS计数器:优雅管理网页元素的计数与序号

113. 探索CSS计数器&#xff1a;优雅管理网页元素的计数与序号 在前端开发中&#xff0c;我们经常需要对网页元素进行计数与序号&#xff0c;如有序列表、表格行号、步骤指示等。为了优雅地管理这些计数与序号&#xff0c;CSS提供了一种强大的功能&#xff1a;CSS计数器&#…

PHP实现首字母头像

<?php $name"哈哈"; $logoletter_avatar($name);echo <img src".$logo." style" border-radius: 50%;">;function letter_avatar($text) {$total unpack(L, hash(adler32, $text, true))[1];$hue $total % 360;list($r, $g, $b) hs…

【2023】Git版本控制-远程仓库详解

目录 创建远程仓库向远程仓库推送数据文件从第二台主机本地拉取远程仓库数据第一台主机同步远程仓库数据tag标签git忽略文件 Git远程仓库是Git版本控制系统的一个概念&#xff0c;它是一个存储Git代码的远程服务器。 你可以将本地Git仓库上传到远程仓库&#xff0c;以便与其他…

WSL1升级为WSL2

首先需要启用组件 使用管理员打开Powershell并运行 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform启用后会要求重启计算机 从https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi获取WSL2 Linux内核更新包&#xff0c;…

实力肯定!Coremail入选中国信通院“铸基计划”2023全景图

近日&#xff0c;由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;主办的“2023数字生态发展大会”暨中国信通院“铸基计划”年中会议在京召开。 会上发布了《高质量数字化转型产品及服务全景图&#xff08;2023&#xff09;》&#xff0c;Coremail凭借着优…

【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入原始方案实现实现问题分析 介绍基础介绍登场角色 案例实现案例一类图实现分析 案例二类图实现 观察者模式在JDK源码的应用总结文章说明 案例引入 有一个天气预报项目&#xff0c;需求如下&#xff1a; 气象站可以将每天测量到的温度、湿度、气压等等以公告的…

修改状态栏The application could not be installed: INSTALL_FAILED_ABORTEDList

打开theme修改状态栏为可见。 <resources xmlns:tools"http://schemas.android.com/tools"><!-- Base application theme. --><style name"Base.Theme.MyApplication" parent"Theme.AppCompat.DayNight"><!-- Customize yo…

从入门到精通:Postman调试微信支付接口的绝佳方法

前期准备 在使用 Postman 调试微信支付接口之前&#xff0c;你需要做好以下准备&#xff1a; 安装 Postman 客户端应用&#xff0c;或使用网页版&#xff1b;成为 微信支付商户&#xff1b;已申请 商户API私钥。 当你已经具备这三个条件&#xff0c;就可以进入微信支付接口调…

【C语言学习】整数范围、整数越界、无符号数

1.整数范围 对于一个字节&#xff08;8位&#xff09;&#xff0c;可以表达的范围是00000000 ~ 11111111 其中00000000 ——> 0 11111111 ~ 10000000 ——> -1 ~ -128&#xff08;从大到小&#xff09; 00000001 ~ 01111111 ——> 1~127&#xff08;从小到大&#xff…