关于C++子类构造函数的重载问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C++子类构造函数的重载问题相关的知识,希望对你有一定的参考价值。

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class Student

public:
Student(int a,string b,char s)

num=a;
name=b;
sex=s;

~Student()
protected:
int num;
string name;
char sex;
;

class Student1:public Student

public:
// Student1()//@@@@@@@注意,在这里有问题,被注释能运行,不被注释就出错
Student1(int a,string b,char c,int d,string e):Student(a,b,c),age(d),addr(e)
void dis_1()

//get_value(a,b,c);
cout<<"num is:"<<num<<endl;
cout<<"name is:"<<name<<endl;
cout<<"sex is:"<<sex<<endl;
cout<<"age is:"<<age<<endl;
cout<<"address is:"<<addr<<endl;

private:
int age;
string addr;
;
void main()

Student1 stud(197,"zhangsan",'M',22,"Jsxz");
stud.dis_1();
getchar();

子类Student1继承自Student,我给Student1写了一个默认的构造函数还有一个用于初始化的构造函数。为什么当默认构造函数Student1()被注释掉之后,程序就能正常运行,一旦默认构造函数Student1()没有被注释,和那个被用于初始化的构造函数一同存在的时候,就会报错,错误提示是
“Student”: 没有合适的默认构造函数可用
这是为什么
我是在VS2010环境下运行的

/*因为你的基类Student里定义了构造函数,基类的默认构造函数不能调用。继承类里也就不可能使用默认构造函数了。
把你基类里的构造函数改为有默认值的构造函数,就能解决你的问题。代码如下:*/
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class Student

public:
Student(int a=0,string b="string",char s='\0') //注意此处为类的各个成员赋予了默认值

num=a;
name=b;
sex=s;

~Student()
protected:
int num;
string name;
char sex;
;

class Student1:public Student

public:
Student1()
Student1(int a,string b,char c,int d,string e):Student(a,b,c),age(d),addr(e)
void dis_1()

//get_value(a,b,c);
cout<<"num is:"<<num<<endl;
cout<<"name is:"<<name<<endl;
cout<<"sex is:"<<sex<<endl;
cout<<"age is:"<<age<<endl;
cout<<"address is:"<<addr<<endl;

private:
int age;
string addr;
;
void main()

Student1 stud(197,"zhangsan",'M',22,"Jsxz");
stud.dis_1();
getchar();


/*仅供参考!
补充:
1、编译器为类合成了默认构造函数。
2、当你自己定义了构造函数时,合成的默认构造函数将不再工作。
3、这时你可定义自己的默认构造函数来代替编译器合成的默认构造函数。
4、为类的成员取默认值,可以对无参数的初始化式取默认值。
例如:Student stud2;stud2.dis_1();stud2的各个成员将取参数里的默认值。
如果有其他问题,请参考我文库里的《类的构造函数,析构函数,复制构造函数,赋值操作符》*/
参考技术A Student1()需要调用基类Student();只要在基类添加默认构造函数:
Student()
多说一句:C 中用void main(),这可不是个很好的主意,大部分编译器都不会支持

以上是关于关于C++子类构造函数的重载问题的主要内容,如果未能解决你的问题,请参考以下文章

C++类的成员函数:构造析构拷贝构造运算符重载

C++类的成员函数:构造析构拷贝构造运算符重载

C++类的成员函数:构造析构拷贝构造运算符重载

赋值构造函数(重载赋值操作符)(c++常问问题二)

C++复制构造函数和=号重载问题

[C++]关于重载运算符的一些建议