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

[Oh My C++ Diary]类继承和类组合(内嵌类)初始化的不同

为了说明方便,暂时设有下面三个类:

public:
 
   A(int i);
 
private:
 
   int a;
 
};
 
class B
 
{
 
public:
 
   B(int i);
 
private:
 
   int b;
 
};
 
class C:public A
 
{
 
public:
 
   C(int i,int j);
 
private:
 
   int c;
 
};

类C是从类A继承过来的,那么类C的构造函数就应该这样写:

C::C(int i,int j):A(i)
 
{
 
   c=j;
 
}
 

但是,如果类C中多了一个private变量——B的对象的话,如下,所以C定义

class C
 
{
 
public:
 
   C(int i,int j);
 
private:
 
   int c;
 
   B b;
 
};
 

那么此时C的定义就应该是:

C::C(int i,int j):b(i)
 
{
 
   c=j;
 
}

比较两种情况下C的构造函数的区别,我们就会发现,在继承的时候,子类的构造函数应该包括“基类所需的形参”,因此“:”之后是“基类名(基类参数)”,即“A(i)”。但是,如果是类组合的话,子类的构造函数应该包括“对象成员所需要的形参”,因此“:”之后是“对象名(参数)”即“b(i)”。注意到这些这话,我们才可以写一个包括继承并且含有内嵌对象的类的构造函数了。设类C定义如下:

class C:public A
 
{
 
public:
 
   C(int i,int j,int k);
 
private:
 
   int c;
 
   B b;
 
};
 

构造函数如下:

C::C(int i,int j,int k):A(i),b(j)
 
{
 
   c=k;
 
}
 

务必要注意,什么时候是类名,什么时候是对象名。

可以这样记着:

类组合的时候,假设类B中包括类A的对象,那么在类B的构造函数中必须要有类A对象的声明,并且,声明的时候应该是

B::(int x,int y):a(x)而不是

B::(int x,int y):A(x)

而如果是继承的时候,假设类B是类A的子类,那么构造函数应该是

B::(int x,int y):A(x)而不是

B::(int x,int y):a(x)

相关文章:

  • [Oh My C++ Diary]operator++()和operator++(int)的区别
  • CSS3: nth-child使用总结
  • js setattribute批量设置css样式
  • Asp类
  • 位运算符
  • media=screen
  • li中的图片和文字不对齐div+css,解决方法
  • js 动态加载事件
  • asp常用函数
  • asp多风格分页类
  • 启动APACHE的时候报错“0x6eec38dc指令引用的0x00000000内存,该内存不能为“read”
  • asp登录类
  • IIS 500错误
  • 找不到iis
  • 为什么2008会出现很多TMP文件
  • [Vue CLI 3] 配置解析之 css.extract
  • 【刷算法】求1+2+3+...+n
  • conda常用的命令
  • interface和setter,getter
  • js继承的实现方法
  • js如何打印object对象
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • sessionStorage和localStorage
  • vue-router的history模式发布配置
  • 读懂package.json -- 依赖管理
  • 后端_MYSQL
  • 三栏布局总结
  • 深度学习在携程攻略社区的应用
  • 在weex里面使用chart图表
  • Mac 上flink的安装与启动
  • 正则表达式-基础知识Review
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​用户画像从0到100的构建思路
  • #if和#ifdef区别
  • #NOIP 2014#Day.2 T3 解方程
  • $ git push -u origin master 推送到远程库出错
  • %check_box% in rails :coditions={:has_many , :through}
  • (02)vite环境变量配置
  • (C语言)逆序输出字符串
  • (LeetCode 49)Anagrams
  • (三)终结任务
  • (万字长文)Spring的核心知识尽揽其中
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .Net的DataSet直接与SQL2005交互
  • .Net各种迷惑命名解释
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET企业级应用架构设计系列之技术选型
  • /bin/rm: 参数列表过长"的解决办法
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ NOI 2001 ] 食物链
  • [100天算法】-x 的平方根(day 61)
  • [20150707]外部表与rowid.txt
  • [ANT] 项目中应用ANT
  • [BZOJ1008][HNOI2008]越狱
  • [CISCN2019 华北赛区 Day1 Web2]ikun