C++中派生类构造函数问题

C++中派生类构造函数问题

书本代码

#include<iostream>
#include<Cstring>
using namespace std;
class Student
{
public:    
	Student(int n, string nam)    
	{        
		num = n;        
		name = nam;   
	 }    
	 ~Student(){}
private:    
	int num;    
	string name;
};
class Student1:public Student
{
public:    
	Student1(int n, string nam, int a) :Student(n, nam)   
	{       
		 age = a;    
	}    
	~Student1(){}
private:    
	int age;
};
int main(void)
{      
	return 0;
}

书本上说派生类没有继承基类的构造函数,但是在数据初始化时,不仅要对派生类初始化,还要对基类进行初始化。所以,派生类的构造函数要按照Student1(int n, string nam, int a) :Student(n, nam)这样写法。那我的问题来了,为什么一定要对基类数据进行初始化?我们先来看一下基类和派生类内存中存储的数据:
C++中派生类构造函数问题_第1张图片
student1继承了student的数据,也就是说,student1的内存中,既有基类的数据,也有自己的数据,他们真实存在的。这是书本上说的。为了验证书本说的,我在主函数中添加如下代码:

 cout << sizeof(Student) << endl;    
 cout << sizeof(Student1) << endl;  

运行结果:

[Running] cd "d:\test2\" && g++ test08.cpp -o test08 && "d:\test2\"test08
28
32
[Done] exited with code=0 in 1.418 seconds

显然书本上说的是对的。也就是说 student1中确实存在 num、name这两个数据。那么我就想,既然他们存在,我可以直接在派生类student1的构造函数中进行所有数据的初始化,而不再对基类student的构函数进行初始化,修改派生类构造函数:

 Student1(int n, string nam, int a)  
 {    
 	num = n;
 	name = nam;   
   	age = a;    
 }    

但是这样改写直接是错的,运行结果:

test08.cpp:21:2: error: no matching function for call to 'Student::Student()'

为什么这样写不行?
有的人说,num、name在派生类student中是私有的不能访问,那么如果我将num、name的属性改成公有的,结果如何?

public:    
 int num;    
 string name;
}

运行结果:

test08.cpp:21:2: error: no matching function for call to 'Student::Student()'

结果一样。
有的人又说,是不是student1并不是真正的继承student,num、name依然是属于student。按照这个猜想,我指明num、name是属于student。

 Student1(int n, string nam, int a)  
 {    
	  Student::num = n;
	  Student::name = nam;   
	  age = a;    
 }    

运行结果:

test08.cpp:21:2: error: no matching function for call to 'Student::Student()'

结果还是一样。也就是说,无论你怎么改,编译都要求对基类的构造函数进行初始化,为什么?????

你可能感兴趣的:(C++笔记)