关于构造函数的一点疑惑

welkinwangwl 2010-01-12 02:49:20
代码如下,想问为什么子类Teacher继承基类Person时,编译会报

错误 1 error C2512: “Person”: 没有合适的默认构造函数可用

要求必须提供一个默认的构造函数,而将Teacher删掉后,就不会报错了


#include<iostream>
#include<string>

using namespace std;

class Person{
private:
public:

Person(int age){

cout<<"Tom"<<endl;
}

virtual void Say(){
cout<<"Hello!I'm a person."<<endl;
}
};

class Teacher:public Person{
public:
Teacher(int age){
}

void Say(){
cout<<"Hello!I'm a teacher."<<endl;
}
};

int main(){
Person p(10); //出错
return 0;
}
...全文
79 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
malu_1982 2010-01-12
  • 打赏
  • 举报
回复
子类调用父类的构造函数时,是调用不带参数的那个。 例如: Base()。

为什么要加system("pause");? 为了让控制台停住。
traceless 2010-01-12
  • 打赏
  • 举报
回复
traceless 2010-01-12
  • 打赏
  • 举报
回复
那是你的test代码加进去没有呀 ???

你加了这么没有:Teacher T(8); 没有加这么会调用基类对应的午餐构造函数
pengzhixi 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 welkinwangwl 的回复:]
派生类如果不显示的指定构造函数,默认是调用基类的无参构造函数吗。可是我在Person中加入无参的构造函数Person(){cout < <"test" < <endl;},编译执行,发现并没有输出test
[/Quote]

因为你是Person p(10); 没有调用你新加入的构造函数。这基本问题去看书
welkinwangwl 2010-01-12
  • 打赏
  • 举报
回复
ok,明白了,谢谢解答
welkinwangwl 2010-01-12
  • 打赏
  • 举报
回复
派生类如果不显示的指定构造函数,默认是调用基类的无参构造函数吗。可是我在Person中加入无参的构造函数Person(){cout<<"test"<<endl;},编译执行,发现并没有输出test
traceless 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 welkinwangwl 的回复:]
就是说派生类的构造函数默认是调用父类的无参构造函数,对吗
[/Quote]

是的。构造函数的调用也是一一对应的。所以你可以两种方法解决
lovesi3344 2010-01-12
  • 打赏
  • 举报
回复
正解
楼主没有初始化基类部分

[Quote=引用 6 楼 traceless 的回复:]
两种方法:

第一种如上所述;

第二种在Person类中加入:Person(){}
[/Quote]
ithiker 2010-01-12
  • 打赏
  • 举报
回复
为什么要加system("pause");?
traceless 2010-01-12
  • 打赏
  • 举报
回复
两种方法:

第一种如上所述;

第二种在Person类中加入:Person(){}
  • 打赏
  • 举报
回复


class Person{
private:
public:

Person(int age){
cout<<"Tom"<<endl;
}

virtual void Say(){
cout<<"Hello!I'm a person."<<endl;
}
};

class Teacher:public Person{
public:
Teacher(int age):Person(age){ //子类显式调用一下基类的构造
}

void Say(){
cout<<"Hello!I'm a teacher."<<endl;
}
};

int main(){
Person p(10); //出错
return 0;
}
welkinwangwl 2010-01-12
  • 打赏
  • 举报
回复
就是说派生类的构造函数默认是调用父类的无参构造函数,对吗
pengzhixi 2010-01-12
  • 打赏
  • 举报
回复

#include<iostream>
#include<string>

using namespace std;

class Person{
private:
public:

Person(int age){

cout<<"Tom"<<endl;
}

virtual void Say(){
cout<<"Hello!I'm a person."<<endl;
}
};

class Teacher:public Person{
public:
Teacher(int age):Person(age){
}

void Say(){
cout<<"Hello!I'm a teacher."<<endl;
}
};

int main(){
Person p(10);
system("pause");
return 0;
}
xixiaoliu 2010-01-12
  • 打赏
  • 举报
回复
因为 Person 没有默认构造函数阿
要这样:
Teacher(int age) : Person(age)
{
}

pengzhixi 2010-01-12
  • 打赏
  • 举报
回复
因为你的 Teacher类要调用Person默认构造函数,而你没有提供默认构造函数,所以编译出错。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧