派生类不能继承基类的构造函数,若想通过派生类来对基类的private的变量成员进行初始化则需要:

  通过派生类的构造函数来调用基类的构造函数完成基类成员变量的初始化.

看下面的例子:

#include <iostream>
#include<string> using namespace std; class People {
private:
char *m_name;
int m_age; public:
People(char*, int);
}; People::People(char* name,int age):m_name(name),m_age(age){} class Student : public People {

//此处的public是将其基类:People 的成员以其在People内的级别于Student中继承,
//即成员在基类中是什么级别就以什么级别被派生类继承.protected则是将public级别的成员改为protected被派生类继承,private则是
//全变成private被派生类继承

private:
float m_score; public:
Student(char* name, int age, float score);
//void display();
}; Student::Student(char*name,int age,float score):People(name,age),m_score(score){
cout << " 姓名: " << name << " 年龄: " << age << " 成绩: " << score << endl;
} //在此处调用基类的构造函数,可调换基类构造函数的顺序,当然相应的形参位置也要变. /*void Student::display() {
cout <<" 姓名: "<< m_name << " 年龄: " << m_age << " 成绩: " << m_score << endl;
}*/ int main()
{
Student *pstu = new Student("Chan",21,99);
//pstu->display();
return 0;
}

错误用法:

Student::Student(char *name, int age, float score){
People(name, age);
m_score = score;
} //error

因为派生类没有继承基类的构造函数,所以不能调用基类的构造函数.

构造函数调用顺序:

  先是调用基类的构造函数,然后再调用派生类的构造函数,多继承亦然.

注意事项:多继承如 A -- B -- C    只能直接调用基类构造函数,不能间接调用基类构造函数,即B可调用A,但C不可调用A.

/*C++ 这样规定是有道理的,因为我们在 C 中调用了 B 的构造函数,B 又调用了 A 的构造函数,相当于 C 间接地(或者说隐式地)调用了 A 的构造函数,如果再在 C 中显式地调用 A 的构造函数,那么 A 的构造函数就被调用了两次,相应地,初始化工作也做了两次,这不仅是多余的,还会浪费CPU时间以及内存,毫无益处,所以 C++ 禁止在 C 中显式地调用 A 的构造函数。 */

通过派生类创建对象时必须要调用基类的构造函数,这是语法规定。换句话说,定义派生类构造函数时最好指明基类构造函数;如果不指明,就调用基类的默认构造函数(不带参数的构造函数);如果没有默认构造函数,那么编译失败。

请看下面的例子:

#include<iostream>
#include<string> using namespace std; class People {
private:
char* m_name;
int m_age; public:
People();
People(char*, int);
}; People::People(char* name, int age) :m_name(name), m_age(age) {};
People::People() :m_name("xxxx"), m_age() {}; class Student : public People {
private:
float m_score; public:
Student();
Student(char *name, int age, float score);
}; Student::Student() :People(), m_score() {
cout << "姓名:xxxx" << " 年龄:00" << " 成绩:0" << endl;
}; Student::Student(char* name, int age, float score) :People(name, age), m_score(score) {
cout << "姓名:" <<name<< " 年龄:" <<age<< " 成绩:" <<score<< endl;
}; int main() {
Student *pstu = new Student;
Student *pstu1 = new Student("陈东",,88.5);
return ;
}

如果将People(name, age)去掉,也会调用默认构造函数.(上面代码执行后看不出来,需修改People类的private为protected,再在student类中写void  display())

 void Student::display(){
cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<"。"<<endl;
}

附:https://blog.csdn.net/qq_23996069/article/details/89344816

转载来源:http://c.biancheng.net/view/2276.html

C++基类和派生类的构造函数的更多相关文章

  1. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  2. C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序

    基类和派生类:构造函数和析构函数的执行顺序 在Visual Studio中,新建控制台工程,构造类如下: #include<iostream> using namespace std; c ...

  3. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; ...

  4. 基类和派生类--this

    基类指针在程序运行的时候的确指向的是一个派生类的对象,但指针的类型仍然是基类指针.C++是一种强类型语言,因此不能用基类指针类型的指针直接调用派生类:而且,同一个类可能有多种不同的派生类,因此不知道实 ...

  5. C++:基类与派生类对象之间的赋值兼容关系

    4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量. ...

  6. C++:基类和派生类

    4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public: void print() { cout<<"name:"&l ...

  7. C++基类和派生类之间的转换

    本文讲解内容的前提是派生类继承基类的方式是公有继承,关键字public 以下程序为讲解用例. #include<iostream> using namespace std; class A ...

  8. Java基类和派生类

    背景:对基类和派生类有更清晰的认识. 从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 .但继承并不仅仅是类的复用.当创建了一个派生类的对象时,该类包含了一个基类的子对 ...

  9. c++ 的类 和 类继承, 什么是c++中的基类和派生类?

    闲云潭影日悠悠,物换星移几度秋 你既然已经做出了选择, 又何必去问为什么选择.鬼谷绝学的要义, 从来都不是回答, 而是抉与择 普通类 #ifndef TABTENN0_H_ #define TABTE ...

  10. DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例

    当一个类依赖于另一个具体类的时候,这样很容易形成两者间的"强耦合"关系.我们通常根据具体类抽象出一个接口,然后让类来依赖这个接口,这样就形成了"松耦合"关系,有 ...

随机推荐

  1. jenkins安装自动部署

    1.1简介: 开源项目,一个可扩展的持续集成引擎.提供了一种易于使用的持续集成系统,能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性.还做到持 ...

  2. HDU2089 不要62 题解 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题目大意:求区间 \([l,r]\) 范围内不包含数字"4"且不包含连续的数 ...

  3. C++ 模板常见特性(函数模板、类模板)

    背景 C++ 是很强大,有各种特性来提高代码的可重用性,有助于减少开发的代码量和工作量. C++ 提高代码的可重用性主要有两方面: 继承 模板 继承的特性我已在前面篇章写过了,本篇主要是说明「模板」的 ...

  4. python利用scapy嗅探流量

    能实时监测流量, 只显示有问题的流量, 可疑流量要显示出在那个数据包里 所有流量都保存到为pcap 每5000个包保存一个 第3个自动下载到本地       def sniff(count=0, st ...

  5. java高并发梳理

  6. 2019 年百度之星 初赛一 1002 Game

    传送门 Problem Description 度度熊在玩一个好玩的游戏.游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格.现在他要依次完成 n 个任 ...

  7. python常用英语单词(初学,英语不好的适用)

    对于刚才是学习python这些也足够了,一天学个六七个单词记一下在配合自己寻找的视频.书籍等等方法去学习是有一定帮助的. 这里还是要说一句,仅供兴趣爱好学习使用,个人开发者(非考虑未来靠此为生的人士) ...

  8. Linux Cgroup浅析

    cgroup从2.6.4引入linux内核主线,目前默认已启用该特性.在cgroup出现之前,只能对一个进程做资源限制,比如通过sched_setaffinity设置进程cpu亲和性,使用ulimit ...

  9. Java 基础(三)| IO流之使用 File 类的正确姿势

    为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 File 类? java ...

  10. cogs 1176. [郑州101中学] 月考 Map做法

    1176. [郑州101中学] 月考 ★★☆   输入文件:mtest.in   输出文件:mtest.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在上次的月考中B ...