C++ 面向对象、多继承

news2025/2/28 6:25:44
// Student.h

class Student {
private: // 私有的,外界不能访问
    char *name;
    int age;

public:
    void setAge(int age);
    void setName(char* name);
    int getAge();
    char* getName();

    // 空参构造函数
    Student(){
    }

    // 一参构造函数
    Student(char* name) : Student(name,80) {
        // 调用两参的构造函数,与 java 有点不同,又与 Kotlin 继承调用父类构造有点像
    }

    // 两参构造函数
    Student(char* name, int age) {
    }

    // 析构函数 对象的临终遗言,一般用来做释放工作,与 java 的 finalize() 类似
    ~Student() {
    }

    // 拷贝构造函数,它默认有,可以重写
    // 对象1 = 对象2
    Kang(const Kang &kang) { // 常量引用:只读
        // 可以对原来的对象做一些操作
    }

    // const修饰方法后面:只读的函数
    void showInfo() const {
    }

    // 定义友元函数,供外界重写来访问私有成员
    friend void updateAge(Kang *kang,int age);

    // 友元类,友元类可访问自身的私有成员
    friend class Person;
    // java 中能用反射获取到其他类私有成员,底层就是友元实现的


    // 运算符重载,基本上都是写在类里面的,因为可以拿到类的私有成员
    // const:不允许修改,只读
    // &:性能的提高,如果没有 & 运行 + 会构建新的副本
    Student operator+(const Student &s1) {
        int number = this->getAge() + s1.age;
        return Student(this->getName(), number);
    }
};

 与 java 一样,C++也是面向对象的,和 java 非常相似:
新创建一个头文件 Student.h,里面定义了一个 Student 类

构造函数:和 java 相比大部分相同,只是在构造函数之间的相互调用有一些出入
析构函数:在对象销毁时会调用此函数,类似 java 的 finalize()
拷贝构造函数:在对象之间直接赋值会调用此函数,可以在赋值时做一些操作

友元函数 / 类:都基于友元思想,只能在类中定义,友元函数供外界重写来访问私有成员,友元类能直接访问私有成员

运算符重载:就是自定义符号运算规则,基本上都是写在类里面,因为可以拿到类的私有成员


// Student.cpp

#include "Student.h"

void Student::setAge(int age) {
    this->age = age;
}

void Student::setName(char *name) {
    this->name = name;
}

int Student::getAge() {
    return this->age;
}

char *Student::getName() {
    return this->name;
}

为了演示,我只在实现文件实现 get/set,其实把全部函数的实现都写在头文件都可以的,但是为了解耦和可读性,最好还是在头文件声明实现文件中进行实现


#include <iostream> // C++ 的标准支持
#include "Student.h"

// new/delete 是一套 会调用构造函数 与 析构函数 【C++标准规范】
// malloc/ free 是一套 不调用构造函数 与 析构函数 【C的范畴,虽然不推荐,但是也是可以的】

int main() {

    Student s1; // 调用空参构造函数(栈区开辟)
    Student s2("小民"); // 调用一个参数的构造函数(栈区开辟)

    // new 关键字返回的是对象的指针
    Student *s3 = new Student("小红"); // 调用一个参数的构造函数(堆区开辟)
    delete s3;

    // 调用拷贝构造函数
    Student s4 = s1;

    return 0;
}

与 java 不同,像 Student s1,java 只是定义了一个空的变量,而 C++ 是实打实的创建了一个对象

new 的时候,C++返回的是一个指针,销毁时需要手动调用 delete 做释放工作。


总所周知 java 是单继承的,但是在 C++ 中是多继承的,但是多继承可能会带来一些冲突(二义性)

// Test.cpp

#include <iostream>

// 祖父类
class Object {
public:
    int number;
};

// 父类1
class Parent1 : public Object {
};

// 父类2
class Parent2 : public Object {
};

// 子类
class Son : public Parent1, public Parent2 {
};

int main() {
    Son son;
    // 报错,编译器不知道找哪个父类的 number
    son.number = 2000;

    // 方法一:明确指定
    son.Parent1::number = 1000;

    // 方法二:Parent1 和 Parent2 都使用虚继承,例如:
    // class Parent1 : virtual public Object {
    // 这样子 子类去访问父类成员时,直接访问祖父类,就不会有歧义了

    return 0;
}

代码中创建一个祖父类 Object,Parent1 和 Parent2 分别继承了 Object,子类双继承(Parent1 和 Parent2)如图:

 在 main 函数中可以看到,直接在 son 中访问父类成员 number 是编译不通过的,因为编译器不知道找哪个父类的 number,这个问题需要解决,解决办法:

方法一:明确指定是哪个父类即可

方法二:父类使用虚继承,Parent1 和 Parent2 都使用 virtual 关键字继承 Object,这样子在子类去访问父类成员时,会直接访问祖父类,这样就不会有歧义了 

方法三:比较 low,子类覆盖定义父类变量,比较简单,就不演示了


在真实的开发过程中,应当严格避免二义性。

这样子看来,java 就显得非常好,单继承 + 多实现不会出现二义性,但是如果需要底层开发和对性能有要求的话,C++仍是不二之选

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

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

相关文章

干翻Hadoop系列:MapReduce详解

第一章&#xff1a;MapReduce原理 数据存储在分布式文件系统中HDFS里边&#xff0c;通过使用Hadoop资源管理系统YARN&#xff0c;Hadoop可以将MapReduce计算&#xff0c;转移到有存储部分的数据的各台机器上。 一&#xff1a;概念和原理 1&#xff1a;MapReduce作业 MapRed…

【机器学习】P16 激活函数 Activation Function

对于激活函数&#xff08;Activation Function&#xff09;&#xff0c;存在两个问题&#xff1a; 为什么要用激活函数&#xff1f;如何选择用哪种激活函数&#xff1f;如何使用激活函数&#xff1f; 本博文将围绕这两个问题&#xff0c;首先介绍激活函数的作用&#xff0c;从…

2023腾讯云轻量应用服务器性能评测

腾讯云轻量应用服务器性能如何&#xff1f;CPU型号主频、内存、公网带宽和系统盘存储多维对比&#xff0c;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;相对于CVM云服务器轻量服务器更适合轻量级的应用&#xff0c;轻量服务适合中小企或个人开发者用于搭建We网站b应用…

利用Python生成和识读二维码(QR Code)和微二维码(Micro QR Code)

目录一、环境准备二、二维码&#xff08;QR Code&#xff09;生成和读取2.1 生成二维码2.2 读取二维码三、微二维码&#xff08;Micro QR Code&#xff09;生成和读取3.1 生成微二维码3.2 读取微二维码之前写的一篇 博客采用了segno库来做微二维码的生成&#xff0c;该库可以方…

AD9689 input clock not detect

在项目调试中&#xff0c;遇到的问题&#xff0c;在ADI论坛上发帖咨询&#xff0c;转发到这里。网址如下&#xff1a; AD9689 input clock not detect - Q&A - High-Speed ADCs - EngineerZone (analog.com) Our FPGA board has two AD9689&#xff0c;one works ok, but…

使用Marshaller 将Java对象转化为XML格式和字符串转为xml

使用Marshaller 将Java对象转化为XML格式 对象转xml内容 ①工具类 public static String convertObjectToXml(Object obj) throws Exception {StringWriter writer new StringWriter();// 创建 JAXBContext 和 MarshallerJAXBContext context JAXBContext.newInstance(obj.ge…

MySQL客观题

MySQL客观题 在数据库的三级模式结构中&#xff0c;描述数据库中全体数据的全局逻辑结构和特性的是&#xff08; A &#xff09; A 模式 B 内模式 C 存储模式 D 外模式 数据库系统的特点是&#xff08; A &#xff09;、数据独立、减少数据冗余、避免数据不一致和加强了数据保…

自定义jar项目上传到Maven中央仓库/maven仓库/阿里云效仓库

1.前言 如何把自己的项目Jar或者Starter上传到Maven中央仓库中。 2.https://issues.sonatype.org/注册账号 3.注册成功 登录新建项目 摘要随意填写 重点来了 groupId 如果有自己域名的就自己域名com.xxx 如果用的gitee那么填写com.gitee.自己gitee的用户名 projectUrl&…

ASEMI代理AD8603AUJZ-REEL7原装ADI车规级AD8603AUJZ-REEL7

编辑&#xff1a;ll ASEMI代理AD8603AUJZ-REEL7原装ADI车规级AD8603AUJZ-REEL7 型号&#xff1a;AD8603AUJZ-REEL7 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOT-23-5 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;5 类型&#xff1…

WOT全球技术创新大会2023整装待发,一起去见证科技的力量

从2012年开始&#xff0c;51CTO已经连续11年、累计奉献了19场WOT全球技术创新大会。 11年时间&#xff0c;有的技术如神话般崛起又泡沫般消失&#xff1b;有的技术历经时光磨砺而愈发彰显价值&#xff1b;有的技术充满争议而争议还在继续。 为什么我们会持续策划、举办WOT&am…

Pyspark_用户画像项目_1(数据通过Sqoop导入到Hive中)

Pyspark 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase Hi…

bdydns.com是什么网站?

bdydns.com是网站域名接入百度云CDN后&#xff0c;域名CNAME解析的记录值。网站接入百度云CDN&#xff0c;需要添加CNAME域名解析&#xff0c;例如新手站长网接入百度CDN后&#xff0c;域名CNAME解析到百度CDN地址&#xff1a;www.xinshouzhanzhang.com.a.bdydns.com&#xff0…

DQN算法详解

DQN算法详解 一.概述 强化学习算法可以分为三大类&#xff1a;value based, policy based 和 actor critic。常见的是以DQN为代表的value based算法&#xff0c;这种算法中只有一个值函数网络&#xff0c;没有policy网络&#xff0c;以及以DDPG,TRPO为代表的actor-critic算法…

两层神经网络的参数求导过程

假设输入数据 x∈Rnx\in\mathbb{R}^nx∈Rn&#xff0c;两层神经网络有以下形式&#xff1a; 其中 W1∈RhnW_1\in\mathbb{R}^{h\times n}W1​∈Rhn 和 W2∈RmhW_2\in\mathbb{R}^{m\times h}W2​∈Rmh 分别是第一层和第二层的权重矩阵&#xff0c;b1∈Rhb_1\in\mathbb{R}^hb1​∈…

如何高效地设计测试用例并评审

编写出好的测试用例是每一个测试工程师的职责&#xff0c;但在实际工作中大家写的测试用例往往需要不断地修改才能使用&#xff0c;这不仅浪费了时间&#xff0c;还容易让测试工程师产生自我否定的情绪&#xff0c;甚至在团队中产生各种矛盾。 那如何高效地设计测试用例呢&…

一日一题:第十一题---模拟堆(很认真!)

​作者&#xff1a;小妮无语 专栏&#xff1a;一日一题 &#x1f6b6;‍♀️✌️道阻且长&#xff0c;不要放弃✌️&#x1f3c3;‍♀️ 哭了&#xff0c;一定要记录&#xff0c;为了&#xff0c;写这篇文章千辛万苦 堆笔记 题目描述&#xff1a; 维护一个集合&#xff0c;初始…

javaagent 使用注意

前言 最近做项目&#xff0c;需要实现一个agent&#xff0c;实现运行过程替换字节码&#xff0c;当笔者实现这些功能时发现还是很多注意事项的。而且字节码的替换过程如果类的属性与方法升级了&#xff0c;那么加载就会报错。这种做法的好处是代码无侵入&#xff0c;缺点也很明…

离散化的应用

前言&#xff1a;我们了解离散化的都知道&#xff0c;离散化的本质就是将几个差距很大的数映射成相差较小的数据&#xff0c;同时又保证了数据间的相对大小关系不会发生改变&#xff0c;离散化还是有些争议较大的问题的&#xff0c;比如去重问题等&#xff0c;下面我们就来深入…

从抓包的角度分析connect()函数的连接过程

这篇文章主要是从tcp连接建立的角度来分析客户端程序如何利用connect函数和服务端程序建立tcp连接的&#xff0c;了解connect函数在建立连接的过程中底层协议栈做了哪些事情。 tcp三次握手 在正式介绍connect函数时&#xff0c;我们先来看一下tcp三次握手的过程&#xff0c;下…

用孕妇的思维和孕妇对话——《用孩子的思维和孩子对话》

看惯了某鱼上经典的卖货话术&#xff0c;“不懂事怀孕了&#xff0c;遂出”。没想到我居然也快要当爸爸了。这几个月准爸爸的生活让我切身的体会到了孕妇的不容易以及陪伴孕妇的辛苦。本文不打算歌颂母亲或者替准爸爸们倒苦水&#xff0c;单纯总结思考一下孕期夫妻如何沟通。加…