3.7 C++派生类构造函数调用规则
参考:http://www.weixueyuan.net/view/6364.html
总结:
派生类构造函数可以自动调用基类的默认构造函数而无需显式调用。
生类构造函数可以自动调用基类的默认构造函数,但是前提是默认构造函数必须存在。
当基类没有默认构造函数时,派生类则无法自动调用基类的默认构造函数了。遇到这种情况有两种解决方案:其一,在基类中定义一个默认构造函数(不带参数的构造函数),例如上一节中的例2;其二,派生类中的每一个构造函数都显式的调用基类中的带参构造函数。
建议在设计类的时候为每一个类设计一个默认构造函数,毕竟默认构造函数并不会妨碍构造函数的显式调用。
在创建派生类对象时,必须显式或隐式地调用基类的某一个构造函数
派生类构造函数可以自动调用基类的默认构造函数而无需显式调用。例如在上一节例2中,我们如果将condingbook类中的默认构造函数codingbook():book(){lang = none;}语句修改为codingbook(){lang = none;},则这个程序运行结果依然保持不变,因为派生类的构造函数会自动调用基类的默认构造函数。
派生类构造函数可以自动调用基类的默认构造函数,但是前提是默认构造函数必须存在。通常情况下,默认构造函数系统会自动生成的,但是如果在基类中,我们自己定义了一个带参数的构造函数,这个时候,系统是不会为基类自动生成默认构造函数的,这个时候派生类则无法自动调用基类的默认构造函数了,因为基类根本就不存在默认构造函数。遇到这种情况有两种解决方案:其一,在基类中定义一个默认构造函数(不带参数的构造函数),例如上一节中的例2;其二,派生类中的每一个构造函数都显式的调用基类中的带参构造函数。
例1:
class base
{
public:
base(int a){x = a; y = ;}
base(int a, int b){x = a; y = b;}
private:
int x;
int y;
}; class derived: public base
{
public:
derived(){z = ;}
derived(int c){z = c;}
private:
int z;
};
我们来看一下这个例子,这个例子里面先定义了一个类base作为基类,基类中拥有两个成员变量x和y,同时定义了两个带参数的构造函数,两个都是带参构造函数,如此一来类base就不会自动生成默认构造函数了。再来看派生类定义,派生类中新增了成员变量z,并且定义了一个带参构造函数和一个默认构造函数。但是如此定义,编译器会提示语法错误,因为派生类的构造函数没有显示调用基类构造函数。解决这个问题的方法在上面说了,一个是在基类自己定义一个默认构造函数,另外一种方法是显示调用基类构造函数。当然在设计类的时候推荐使用后者,毕竟构造函数就是为了初始化成员变量的,如果不显式调用基类构造函数,则从基类中继承过来的成员变量将得不到初始化,这一般来说都不是我们所希望看到的。
同时,我们还建议在设计类的时候为每一个类设计一个默认构造函数,毕竟默认构造函数并不会妨碍构造函数的显式调用。通常我们还会遇到这样一种情况,派生类中并未显式定义构造函数,这个时候派生类中只有系统自动生成的默认构造函数,如此一来,如果我们不为基类设计一个默认构造函数,则程序就会编译出错。这种错误很玄妙,如果不小心还真是难以发现。为了避免这种情况的发生,我们建议为每一个类设计一个默认构造函数。
根据以上两点建议,我们将例1进行修改,正确代码如下。
例2:
#include<iostream>
using namespace std; class base
{
public:
base(){x = ; y = ;}
base(int a){x = a; y = ;}
base(int a, int b){x = a; y = b;}
private:
int x;
int y;
}; class derived: public base
{
public:
derived():base(){z = ;}
derived(int a, int b, int c):base(a,b){z = c;}
private:
int z;
}; int main()
{
derived A;
derived B(,,);
return ;
}
在这个例子中,我们将例1中出现的问题采用双管齐下的方式解决了,为基类定义了默认构造函数,并且在派生类中显式地调用基类中的构造函数。
总的来说,在创建派生类对象时,必须显式或隐式地调用基类的某一个构造函数,这一点非常重要。当然被调用的基类的构造函数可以是带参构造函数,也可以是默认构造函数。
3.7 C++派生类构造函数调用规则的更多相关文章
- C++派生类构造函数调用顺序(详解)
我们来看下面一段代码: class B1 { public: B1(int i) {cout<<"constructing B1 "<<i<<e ...
- C++ //构造函数调用规则 //1.创建一个类,C++编译器会给每个类添加至少3个函数 //默认构造(空实现) //析构函数(空实现) //拷贝函数(值拷贝) //2.如果我们写了有参构造函数 编译器就不会提供默认构造函数 但是会提供拷贝构造函数 //3.如果我们写了拷贝函数 编译器就不再提供 默认 有参 构造函数
//构造函数调用规则 #include <iostream> using namespace std; //1.创建一个类,C++编译器会给每个类添加至少3个函数 //默认构造(空实现) ...
- 《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则
原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数. ...
- C++学习17派生类的构造函数
基类的构造函数不能被继承,在声明派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数来完成.所以在设计派生类的构造函数时,不仅要考虑派生类新增的成员变量,还要考虑基类的成员变量,要让它们都 ...
- c++ 派生类的构造函数 与 基类构造函数的关系
<面向对象程序设计基础(第二版>李师贤等,第254页:C++语言的基本规则是:创建一个派生类的对象时,如果基类带有构造函数,则先调用基类的构造函数,然后才调用派生类的构造函数. <T ...
- C++中的类继承(2)派生类的默认成员函数
在继承关系里面, 在派生类中如果没有显示定义这六个成员 函数, 编译系统则会默认合成这六个默认的成员函数. 构造函数. 调用关系先看一段代码: class Base { public : Base() ...
- C++:派生类的构造函数和析构函数
4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类 ...
- C++ | 继承(基类,父类,超类),(派生类,子类)
转载:https://blog.csdn.net/Sherlock_Homles/article/details/82927515 文章参考:https://blog.csdn.net/war1111 ...
- C++ 派生类构造函数和析构函数
几个问题 一个类的各数据成员的构造顺序? 按他们在类定义中出现的先后顺序:先定义者先构造. 类的对象成员的构造函数与类自身的构造函数的执行顺序? 先执行对象成员的构造函数,再执行类自身的构造函数. 构 ...
随机推荐
- Servlet JDBC Example
Develop a web application that should have following features. User can register and then login to t ...
- 如何通过 Terminal 设置截图存储的位置
由于截图的默认位置是存储在 desktop 上的,而 desktop 又是我们经常见的地方,有一个干净的界面对良好的电脑的体验非常重要,那么可以通过改变截图的默认的存储位置来改变.而改变这一路径需要用 ...
- tchart example
Random random = new Random(); // Color SeriesColor; int SeriesIndex=0; tChart1.Series.Clear(); Steem ...
- 雷林鹏分享:jQuery EasyUI 数据网格 - 添加分页组件
jQuery EasyUI 数据网格 - 添加分页组件 本实例演示如何从服务器端加载数据,如何添加分页组件(pagination)到数据网格(datagrid). 创建数据网格(DataGrid) 为 ...
- U8800 手机恢复出厂设置出现轻触Android开始页面 处理办法
U8800 恢复出厂设置出现轻触Android开始页面处理办法 问题现象 Huawei 手机U8800刷机后,点击恢复出厂默认设置后,出现了一个一直停留在“欢迎使用Android 轻触 Android ...
- 详细讲解Linux下安装python3(Python3.5.4)
https://jingyan.baidu.com/article/6b97984dd6dbb01ca2b0bf0a.html
- JS获取系统时间--JavaScript基础
1.网页中实时显示当前时间 <!DOCTYPE html><html lang="en"><head> <meta charset=&qu ...
- asyncio创建协程解析——分析廖雪峰的Python教程之创建WEB服务(转)
第一步,搭建开发环境 所需第三方库: aiohttp,异步 Web 开发框架:jinja2,前端模板引擎:aiomysql,异步 mysql 数据库驱动 所需内置库: logging,系统日志:asy ...
- Mysql中Join用法及优化
Join的几种类型 笛卡尔积(交叉连接) 如果A表有n条记录,B表有m条记录,笛卡尔积产生的结果就会产生n*m条记录.在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者直接用f ...
- 动态改变Listview的item背景颜色和item中字体的颜色
https://blog.csdn.net/qq_14813933/article/details/50417859