C++基类和派生类的构造函数
派生类不能继承基类的构造函数,若想通过派生类来对基类的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++基类和派生类的构造函数的更多相关文章
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序
基类和派生类:构造函数和析构函数的执行顺序 在Visual Studio中,新建控制台工程,构造类如下: #include<iostream> using namespace std; c ...
- c++中基类与派生类中隐含的this指针的分析
先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; ...
- 基类和派生类--this
基类指针在程序运行的时候的确指向的是一个派生类的对象,但指针的类型仍然是基类指针.C++是一种强类型语言,因此不能用基类指针类型的指针直接调用派生类:而且,同一个类可能有多种不同的派生类,因此不知道实 ...
- C++:基类与派生类对象之间的赋值兼容关系
4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量. ...
- C++:基类和派生类
4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public: void print() { cout<<"name:"&l ...
- C++基类和派生类之间的转换
本文讲解内容的前提是派生类继承基类的方式是公有继承,关键字public 以下程序为讲解用例. #include<iostream> using namespace std; class A ...
- Java基类和派生类
背景:对基类和派生类有更清晰的认识. 从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 .但继承并不仅仅是类的复用.当创建了一个派生类的对象时,该类包含了一个基类的子对 ...
- c++ 的类 和 类继承, 什么是c++中的基类和派生类?
闲云潭影日悠悠,物换星移几度秋 你既然已经做出了选择, 又何必去问为什么选择.鬼谷绝学的要义, 从来都不是回答, 而是抉与择 普通类 #ifndef TABTENN0_H_ #define TABTE ...
- DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例
当一个类依赖于另一个具体类的时候,这样很容易形成两者间的"强耦合"关系.我们通常根据具体类抽象出一个接口,然后让类来依赖这个接口,这样就形成了"松耦合"关系,有 ...
随机推荐
- C# 对象与引用变量
从宏观的角度来看,对象是类的实例.比如: //定义一个名为Someone的类,代表这么一些人(通过指定年龄,性别,性格等基本信息)class Someone { public int age; p ...
- leetcode.199二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <-- ...
- spring cloud微服务快速教程之(四)熔断器(Hystrix)及其工具(Dashboard、Turbine)
0-为什么需要熔断器 在分布式系统中,各个服务相互调用相互依赖,如果某个服务挂了,很可能导致其他调用它的一连串服务也挂掉或者在不断等待中耗尽服务器资源,这种现象称之为雪崩效应: 未来防止系统雪崩,熔断 ...
- 傅立叶变换—FFT
FFT(快速傅立叶变换)使用“分而治之”的策略来计算一个n阶多项式的n阶DFT系数的值.定义n为2的整数幂数,为了计算一个n阶多项式f(x),算法定义了连个新的n/2阶多项式,函数f[0](x)包含了 ...
- Go合集,gRPC源码分析,算法合集
年初时,朋友圈见到的最多的就是新的一年新的FlAG,年末时朋友圈最多的也是xxxx就要过去了,你的FLAG实现了吗? 这个公众号2016就已经创建了,但截至今年之前从来没发表过文章,现在想想以前很忙, ...
- spring-boot序章:打造博客系统
blog 使用spring-boot打造一个博客系统,在项目中学习! 项目功能 文章 游览 创建 编辑 删除 评论 用户 游客 注册用户 关注 被关注 后台统计 注册用户数 在线人数 文章总数 评论总 ...
- axios全局引用
在vue项目开发中,我们使用axios进行ajax请求,很多人一开始使用axios的方式,会当成vue-resoure的使用方式来用,即在主入口文件引入import VueResource from ...
- cogs 247. 售票系统 线段树
247. 售票系统 ★★☆ 输入文件:railway.in 输出文件:railway.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市 ...
- 快速幂模板Super
//求x^nint ans=1;while(n){ if(n&1) ans=ans*x; x*=x; n>>=1;} 快速幂就是快速算底数的n次幂.其时间复杂度为 O(logN), ...
- js强制限制输入允许两位小数
<input type="text" value="@item.CostCash.Value.ToString("#0.00")" c ...