c++继承子类构造函数问题
c++中子类在继承基类的时候需要在构造函数中初始化变量。如果基类没有构造函数或者只有不带参数的构造函数,那么子类中的构造函数就不需要调用基类的构造函数了。
个人总结了两点子类中构造函数必须调用父类的构造函数的情况(最常见的情况,不完全):
1.当子类(派生类)中申明了父类(基类)类型的对象的时候,必须在子类的构造函数中进行对象的初始化。
2.当子类继承的父类中有带参数的构造函数的时候,必须在子类的构造函数中调用基类的构造函数。
下面以代码为例子:
例一(说明2):
#include <iostream>
#include <string>
using namespace std; class person
{
string name;
int age;
public:
person(string _name,int _age):name(_name),age(_age){}
void call()
{
cout<<"I am a person..."<<endl;
}
}; class student : public person
{
int id;
public:
student(string _name,int _age,int _id):person(_name,_age),id(_id){}
void call()
{
cout<<"I am a student..."<<endl;
}
}; int main()
{
person a("ren",);
student b("jeavenwong",,);
a.call();
b.call();
return ;
}
例二(说明1)
#include <iostream>
#include <string>
using namespace std; class person
{
string name;
int age;
public:
person(string _name,int _age):name(_name),age(_age){}
void call()
{
cout<<"I am a person..."<<endl;
}
}; class animal
{
string name;
int age;
public:
animal(string _name,int _age):name(_name),age(_age){}
}; class student : public person
{
int id;
animal object; //在student类中有animal类的对象,所以必须调用student类的构造函数进行初始化
public:
student(string _name,int _age,int _id):object(_name,_age),person(_name,_age),id(_id){} //注意:这里用对象的名字来对对象object进行初始化。
void call()
{
cout<<"I am a student..."<<endl;
}
}; int main()
{
person a("ren",);
student b("jeavenwong",,);
a.call();
b.call();
return ;
}
例三:
#include <iostream>
#include <string>
using namespace std; class Student
{
protected:
string name;
int age;
int id;
public:
Student(string _name,int _age,int _id):name(_name),age(_age),id(_id){cout<<"Base class constructor..."<<endl;}
~Student(){cout<<"Base class destructor..."<<endl;}
}; class Graduate : public Student
{
private:
string addr;
public:
Graduate(string _name,int _age,int _id,string _addr):Student(_name,_age,_id),addr(_addr){cout<<"sub class constructor..."<<endl;}
~Graduate(){cout<<"sub class destructor..."<<endl;}
void show()
{
cout<<"my name: "<<name<<endl<<"my age: "<<age<<endl<<"my id: "<<id<<endl<<"my addr: "<<addr<<endl;
}
}; int main()
{
Graduate me("jeavenwong",,,"Hefei");
me.show();
return ;
}
例三运行结果:

如有不对,欢迎批评指正!
c++继承子类构造函数问题的更多相关文章
- java构造函数是否可继承,以及子类构造函数可否不使用super调用超类构造函数
问题一:java的构造函数能否被继承? 笔者初学java看的一本书说:“java的子类自然的继承其超类的“非private成员”. 通常java的构造函数被设置为public的(若你不写构造函数,ja ...
- java中继承,子类是否继承父类的构造函数
java中继承,子类是否继承父类的构造函数 java继承中子类是不会继承父类的构造函数的,只是必须调用(隐式或者显式) 下面来看例子: public class TestExtends { publi ...
- C++学习基础十——子类构造函数与析构函数的执行
1.子类构造函数的执行: 先执行父类的构造函数,再执行成员对象的构造函数,最后执行自身的构造函数. 当继承多个类时,构造函数的 执行顺序与继承时的顺序 相同,而与子类构造函数调用父类构造函数的顺序无关 ...
- 三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解
在上节博客中曾提到过类的继承,这篇文章主要是介绍类的继承.构造函数以及静态代码块的执行顺序. 首先接着分析在黑马基础测试中的一个关于继承的题目,题目描述如下: 声明类Person,包含2个成员变量:n ...
- 【C++ Primer | 15】继承的构造函数
继承的构造函数 子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递.如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数. cl ...
- java构造函数使用方法总结 (继承与构造函数)
使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回 ...
- 继承与构造函数(base关键字)
1.背景 我:虽然通过继承减少了代码冗余,但是,每一个子类的构造函数还是需要给所有属性赋值的,很麻烦的. 师:这个好办,用base就行啦. 我:贝司?还吉他呢! 师:别急,首先我们先介绍下实例化子类对 ...
- [c++] 子类构造函数中有默认参数
子类创建对象时调用父类的构造函数: 1 #include <iostream> 2 using namespace std; 3 class Base 4 { 5 public: 6 Ba ...
- C++菱形继承的构造函数
网上搜了很多,大多是关于菱形虚继承的构造函数应该怎么写,或者就是最简单的,四个类都不带参数的构造函数. 本文旨在记录一下困扰了博主1h的问题,非常浅显,有帮助固然好,如果侮辱谁的智商还见谅,当然无限欢 ...
随机推荐
- JAVA中线程到底起到什么作用!
这是javaeye上非常经典的关于线程的帖子,写的非常通俗易懂的,适合任何读计算机的同学. 线程同步 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread ...
- vue-slick 插件配置
autoplay 布尔值 false 自动播放 autoplaySpeed 整数 3000 自动播放间隔 centerMode 布尔值 false 中心模式 centerPadding 字符串 ’50 ...
- 并不对劲的CF1194E:Count The Rectangles
题意 有\(n\)(\(n\leq 5000\))个平行于x轴或平行于y轴的线段.求这些线段围成了多少个长方形.由多个长方形拼成的也算. 题解 考虑暴力的做法:先分别计算每条横着的线与哪些竖着的线有交 ...
- MySQL - 性能优化 & MySQL常见SQL错误用法(转载)
1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如: , ; 一般DBA想到的办法是在type, name, create_time字段上加组合索引.这样条件排序 ...
- Java集合--Hash、Hash冲突
一.Hash 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这 ...
- C# Redis分布式锁的应用 - 叶子栈 - SegmentFault 思否
原文:C# Redis分布式锁的应用 - 叶子栈 - SegmentFault 思否 叶子 1 微信扫一扫 新浪微博 Twitter Facebook C# Redis分布式锁的应用 c#redis分 ...
- 验证组件FluentValidation的使用示例
官方文档:https://fluentvalidation.net/start#complex-properties 示例Demo:https://github.com/DavideYang125/F ...
- 有趣的"=="与"==="
console.log([]==![]);//true //"=="会进行类型转换,转换成统一类型进行比较 // !符号优于==,[]boolean值为TRUE,所以![]就是FA ...
- jQuery EasyUI 应用 – 创建 CRUD 应用(表格)
jQuery EasyUI 应用 - 创建 CRUD 应用 本节介绍如何创建CRUD应用. CRUD分别是指在做计算处理时的增加(Create).读取查询(Retrieve).更新(Update)和删 ...
- JPA中的主键生成策略
通过annotation(注解)来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@Gen ...