子类继承父类的时候对于构造函数以及成员的探讨:
先进行代码分析:
.h文件:
#ifndef _0519001_H
#define _0519001_H
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
const int basemem = 3;
class base
{
public:
//base(){};
base(int tmp);
virtual void doprt();
protected:
int mem;
};
class sub:public base
{
public:
sub();
virtual void doprt();
};
#endif
.cpp文件:
#include "0519001.h"
using namespace std;
base::base(int tmp)
{
this->mem = tmp;
cout<<"base mem is "<<this->mem<<endl;
//base mem is 3
}
void base::doprt()
{
cout<<"base mem is: "<<this->mem<<endl;
}
/*
sub::sub()
{
cout<<"sub mem is ok" <<endl;
}
*/
sub::sub() : base(basemem)
{
//this->mem = 0;
cout<<"sub mem is "<<this->mem<<endl;
//sub mem is 3
}
void sub::doprt()
{
cout<<"sub mem is: "<<this->mem<<endl;
//sub mem is: 3
}
int main()
{
sub sub1;
sub1.doprt();
return 0;
}
1、构造函数的执行过程:
sub sub1; 在这儿的时候我们知道定义子类对象的时候会先调用父类的构造函数(注意是默认的构造函数),如果没有默认的构造函数或者想进行调用显示的构造函数怎么办呢?
此时我们就必须在子类构造函数的实现的时候加明需要显示调用的父类的哪个构造函数了。如:sub::sub() : base(basemem)
然后进行什么呢?
根据实践发现接下来是对子类的成员进行初始化(如果成员有对应的类变量还会进行调用其构造函数的),然后进行子类的构造函数。
2、子类继承父类的成员变量的初始值问题。
从运行的结果你是否会有这样的疑问:我没有对子类对象进行初始化变量mem的值,为什么子类的对象的值也是3?
因为在调用父类的构造函数的时候,显示的调用父类的base(basemem)构造函数,这样父类的mem成员变量就初始化为3了,子类继承这个变量的时候也就变成了3。
3、上述可以看出,子类可以向父类进行传值(传递变量当然也可以)。