当前位置: 首页 > news >正文

C++ 快速回顾(一)

C++ 快速回顾(一)

  • 前言
  • 一、InLine 内联函数
  • 二、类继承的私有保护公开关系
    • Public
    • Protected
    • Private
  • 三、多继承、菱形继承、虚继承
    • 多继承
    • 菱形继承 和 虚继承


前言

用于快速回顾之前遗漏或者补充C++知识

一、InLine 内联函数

形式如下
在这里插入图片描述
需要注意内联函数体需要:简单、不能有循环或递归

二、类继承的私有保护公开关系

Public

公开继承基类,和我们正常认知一样

class TestBase
{
private:void FuncPrivate(){}
protected:void FuncProtected(){}
public:void FuncPublic(){}
};class TestChild01 : public TestBase
{void TestFunc() {FuncProtected();FuncPublic();}
};int main()
{TestChild01 test01;test01.FuncPublic();
}

Protected

protected 继承变成了TestChild01 的保护成员

class TestBase
{
private:void FuncPrivate(){}
protected:void FuncProtected(){}
public:void FuncPublic(){}
};class TestChild01 : protected TestBase
{void TestFunc() {FuncProtected();FuncPublic();}
};int main()
{TestChild01 test01;//test01.FuncPublic(); // protected 继承变成了TestChild01 的保护成员
}

Private

看下面的代码是看不出来private继承父类和保护继承有什么区别

class TestBase
{
private:void FuncPrivate(){}
protected:void FuncProtected(){}
public:void FuncPublic(){}
};class TestChild01 : private TestBase
{void TestFunc() {FuncProtected();FuncPublic();}
};int main()
{TestChild01 test01;
}

保护变成了TestChild01 的私有
公共也变成了TestChild01 的私有

class TestBase
{
private:void FuncPrivate(){}
protected:void FuncProtected(){}
public:void FuncPublic(){}
};class TestChild01 : private TestBase
{void TestFunc() {FuncProtected();FuncPublic();}
};class TestChild02 : public TestChild01
{void TestFunc() {//FuncProtected(); // 保护变成了TestChild01 的私有//FuncPublic(); // 公共也变成了TestChild01 的私有}
};int main()
{TestChild01 test01;
}

三、多继承、菱形继承、虚继承

多继承

总结一句话就是当接口去用即可,对具体的功能抽象

菱形继承 和 虚继承

轻易不要去写这种,但是要学会去看

class A
{
public:A(){printf("A Ctor.\r\n");}
};class B : public A
{};class C : public A
{};class D : public B, public C
{};int main()
{D d;system("pause");
}

输出结果如下,由于B、C都继承了A,D继承了B、C导致会触发两次A的构造
在这里插入图片描述
如下代码片段是菱形继承导致不知道调用谁的函数

class A
{
public:A(){printf("A Ctor.\r\n");}void TestFunc() {printf("TestFunc.\r\n");}
};class B : public A
{};class C : public A
{};class D : public B, public C
{};int main()
{D d;//d.TestFunc(); 不清楚要调用谁的  B的?C的?还是A的?system("pause");
}

使用虚继承可以解决上面的问题虚继承导致只有A的一份副本,只调用一次A的构造

class A
{
public:A(){printf("A Ctor.\r\n");}void TestFunc() {printf("TestFunc.\r\n");}
};class B : virtual public A
{};class C : virtual public A
{};class D : public B, public C
{};int main()
{D d;d.TestFunc();system("pause");
}

输出结果:
在这里插入图片描述

相关文章:

  • 杭州h5建站ps培训
  • 手机网站开发成本企业信息查询
  • 网站布局结构图世界十大搜索引擎及地址
  • 创业做旅游网站网页版
  • 韩国怎样才能出线汕头网站建设方案优化
  • 网站建设注意怎样创建一个网站
  • 覆盖迁移工具选型、增量同步策略与数据一致性校验
  • 用字符打印中文字“里”
  • 芸众商城系统部署教程 接口报错500 芸众商城队列安装启动教程
  • Javaweb - 5 事件的绑定
  • Sping AI接入deepseek
  • 微信小程序中 rpx与px的区别
  • 【FreeRTOS】FreeRTOS源码概述
  • HSA22HSA29美光固态芯片D8BJVC8BJW
  • 机器学习×第十三卷:集成学习上篇——她不再独断,而是召集小队贴贴你
  • 多线程的同步
  • k8s强制删除podpvpvc和nsnamespace
  • 人机交互动画制作新突破!文本驱动扩散框架HOIDiNi:一句话驱动虚拟人高精度操作物体。
  • GitHub Actions 的深度解析与概念介绍
  • Java8新特性_加强版
  • 采用ArcGIS10.8.2 进行插值图绘制
  • STM32MPU6050 dmp库
  • MyBatis-Plus:从入门到进阶
  • 如何将OBJ文件转成GLB文件
  • NVIDIA GPU架构学习笔记
  • 时序数据库IoTDB可实现的基本操作及命令汇总