派生类构造函数和基类构造函数有什么关系

 我来答
syptt100
推荐于2018-03-14 · TA获得超过125个赞
知道答主
回答量:82
采纳率:0%
帮助的人:59.7万
展开全部
看代码说问题吧。
public class A
{
public A(string a) { }
}
public class B:A
{
public B() { }
}
这段代码编译后,会有个错误提示:A does not contain a constructor that takes '0' arguments ,中文意思类A没有包含无参构造函数。按照提示,我在类A中,添加了无参构造函数,问题解决了。那么为什么会这样呢,我们知道,子类在创建对象执行构造函数之前会先执行父类的构造函数,那么假如父类中有多个构造函数,又是执行哪个呢,这时候base这个关键字我想可以来说明一切。还是看代码吧:
public class A
{
public A() { }
public A(string a) { }
}
public class B:A
{
public B():base()
{ }
}
跟上面的代码差不多,我在A中添加了无参构造函数,然后在B中修改了这句:pubic B():base(){},然后我们测试下,创建一个B对象,在A类中的2个构造函数中设置断点,发现无参构造函数执行了,我想正是因为这个base在这里发挥了作用,是base()指向了父类的无参构造函数。其实,在类B中,我们完全可以省略 base(),也能正常运行,我想,这是系统默认指向了父类的无参构造函数的原因吧,所以也可以省略了,其实大多数时候,我们都是省略不写的。看到这里,我想你应该知道第一段代码中提示的错误的原因了吧,原因是A类中没有无参的构造函数,这样在执行B中的构造函数的时候,就没法执行A中的无参构造函数了。 下面我在写一段不使用无参构造函数的代码,看了会更加清晰:

public class A
{
public A(string a)
{
//
}
}
public class B:A
{
public B(string a):base(a)
{
//
}
}
B中的构造函数指定了调用父类的A(string a)构造函数。这样我们创建B对象在执行构造函数前就会执行父类中对应的指定的构造函数了

参考资料: http://blog.csdn.net/milk1626/archive/2010/07/12/5728836.aspx

天蝎神经侠侣
高粉答主

推荐于2016-08-02 · 关注我不会让你失望
知道大有可为答主
回答量:7533
采纳率:67%
帮助的人:736万
展开全部
看代码说问题吧。
public class A
{
public A(string a) { }
}
public class B:A
{
public B() { }
}
这段代码编译后,会有个错误提示:A does not contain a constructor that takes '0' arguments ,中文意思类A没有包含无参构造函数。按照提示,我在类A中,添加了无参构造函数,问题解决了。那么为什么会这样呢,我们知道,子类在创建对象执行构造函数之前会先执行父类的构造函数,那么假如父类中有多个构造函数,又是执行哪个呢,这时候base这个关键字我想可以来说明一切。还是看代码吧:
public class A
{
public A() { }
public A(string a) { }
}
public class B:A
{
public B():base()
{ }
}
跟上面的代码差不多,我在A中添加了无参构造函数,然后在B中修改了这句:pubic B():base(){},然后我们测试下,创建一个B对象,在A类中的2个构造函数中设置断点,发现无参构造函数执行了,我想正是因为这个base在这里发挥了作用,是base()指向了父类的无参构造函数。其实,在类B中,我们完全可以省略 base(),也能正常运行,我想,这是系统默认指向了父类的无参构造函数的原因吧,所以也可以省略了,其实大多数时候,我们都是省略不写的。看到这里,我想你应该知道第一段代码中提示的错误的原因了吧,原因是A类中没有无参的构造函数,这样在执行B中的构造函数的时候,就没法执行A中的无参构造函数了。 下面我在写一段不使用无参构造函数的代码,看了会更加清晰:

public class A
{
public A(string a)
{
//
}
}
public class B:A
{
public B(string a):base(a)
{
//
}
}
B中的构造函数指定了调用父类的A(string a)构造函数。这样我们创建B对象在执行构造函数前就会执行父类中对应的指定的构造函数了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
aaqxna
推荐于2017-11-23 · TA获得超过1975个赞
知道小有建树答主
回答量:372
采纳率:100%
帮助的人:261万
展开全部
给个定义的形式和例子:
定义形式:
派生类构造函数名(总参数列表):基类1构造函数(参数列表),基类2构造函数(参数列表),....基类n构造函数(参数列表)

例子:
class teacher //基类1
{
public:
teacher(string nam,int a,string t) //构造函数
{
name=nam;
age=a;
title=t;
}
void display()
{
cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"title:"<<title<<endl;
}
protected:
string name;
int age;
string title;
};
class student //基类2
{
public:
student(char nam[],char s,float sco) //基类2的构造函数
{
strcpy(name1,nam);
sex=s;
score=sco;
}
void display1()
{
cout<<"name:"<<name1<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
}
protected:
string name1;
char sex;
float score;
};
class graduate:public teacher,public student //以公有的方式分别从teacher 和student继承
{
public:
graduate(string nam,int a,char s,string t,float sco,float w):
teacher(nam,a,t),student(nam,s,sco),wage(w)
{
}
void show()
{
cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
cout<<"title:"<<title<<endl;
cout<<"wage:"<<wage<<endl;
}
private:
float wage;
};
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式