c++继承子类构造函数问题
2024-09-09 05:05:19
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 ;
}
例三运行结果:
如有不对,欢迎批评指正!
最新文章
- hibernate处理null 时提示:Property path [...] does notreference a collection
- 动态代理模式和AOP探究
- Codeforces Round #138 (Div. 2)
- 数据挖掘:Weka代码学习
- 第一个leapmotion的小游戏
- iMAC——全新重装Mac系统
- DataTable 数据量大时,导致内存溢出的解决方案
- 【Cocos2D-x 3.5实战】坦克大战(2)游戏开始界面
- javaSE_05Java中方法(函数)与重载、递归
- JMeter脚本录制
- Java设计模式 (转)
- JAVA HashMap的实现原理
- log4cxx用环境变量设置输出文件名
- BZOJ_3239_Discrete Logging_BSGS
- vim与程序员
- SQL大数据查询优化
- Java学习随笔(1)--groovy爬虫
- Confluence 6 在数据源连接中启用校验查询
- mongodb基类封装实例
- 细细探究MySQL Group Replicaiton — 配置维护故障处理全集(转)
热门文章
- 【kmp】似乎在梦中见过的样子
- shell习题第17题:检测磁盘
- HTTP协议探究(二):代理、网关和隧道
- java lesson09总结
- Unity 屏幕坐标到UGUI RectTransform本地坐标的转换
- servlet报错“严重: Allocate exception for servlet 类名java.lang.ClassNotFoundException: 路径. 类名”可能原因
- c# ServiceStack web 搭建
- Oracle创建索引;查询索引
- java之JVM学习--简单理解编译和运行的过程之概览
- 红外 NEC编码