为什么编译时会报错[Error] no matching function for call to 'base::base()'

csu之c 2020-04-10 03:18:01
#include <iostream>
using namespace std;

class base{
protected:
string name, sex;
int age;
public:
base(string nam, string se, int a){name = nam; sex = se; age = a;}
void Setname(){cin >> name;}
void Setsex(){cin >> sex;}
void Setage(){cin >> age;}
void showbase();
};
void base::showbase(){
cout << "姓名:" << name << endl;
cout << "性别:" << sex << endl;
cout << "年龄:" << age << endl;
}

class teacher: virtual public base{
private:
string profession;
string teanum;
protected:
int salary;
public:
teacher(string nam, string se, int a, string pro, string tnum, int s):base(nam, se, a){profession = pro; teanum = tnum; salary = s;}
void Setprofession(){cin >> profession;}
void Setteanum(){cin >> teanum;}
void Setsalary(){cin >> salary;}
void showteacher();
};
void teacher::showteacher(){
showbase();
cout << "工号:" << teanum << endl;
cout << "职称:" << profession << endl;
cout << "薪水:" << salary << endl;
}

class student: virtual public base{
protected:
string stunum;
string cla;
string major;
int score;
public:
student(string nam, string se, int a, string snum, string cl, string m, int s):base(nam, se, a){stunum = snum; cla = cl; major = m; score = s;}
void Setstunum(){cin >> stunum;}
void Setcla(){cin >> cla;}
void Setmajor(){cin >> major;}
void Setscore(){cin >> score;}
void showstudent();
};
void student::showstudent(){
showbase();
cout << "学号:" << stunum << endl;
cout << "班级:" << cla << endl;
cout << "专业:" << major << endl;
cout << "分数:" << score << endl;
}


class master: public teacher, public student{
protected:
string company;
public:
master(string nam1, string se1, int a1, string snum, string cl, string m, int s, string nam2, string se2, int a2, string pro, string tnum, int sa, string com)
:teacher(nam2, se2, a2, pro, tnum, sa), student(nam1, se1, a1, snum, cl, m, s) {company = com;}
};

int main()
{
...
}

为什么编译时会报错[Error] no matching function for call to 'base::base()'?
...全文
3286 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2020-04-10
  • 打赏
  • 举报
回复
虚拟继承话,master只有一个base部分,但是你要像他的父类一样提供如何构造,而不能直接从父类继承下来,这就是要你提供默认构造函数的原因。
真相重于对错 2020-04-10
  • 打赏
  • 举报
回复
你把那两个类改成非virutal 继承就不会报错了,但是如果非虚继承的话,master类型就有两个base部分一个是从student,一个是teacher。 例如下面代码,将会输出9和10;
#include <iostream>
#include <typeinfo>
#include <iostream>
#include <string>
using namespace std;
struct Base {
	int m;
	Base(int b):m(b) {

	}
};
struct ch :public Base {
	int x;
	ch(int a):x(a),Base(a){}
};
struct bh :public Base {
	int z;
	bh(int a):z(a),Base(a-1){}
};
struct dh :public ch, public bh
{
	dh(int x):ch(x),bh(x){}
};

int main()
{
	dh d1(10);
	Base* x = static_cast<Base *>(static_cast<ch *>(&d1));
	Base* x1 = static_cast<Base *>(static_cast<bh *>(&d1));
	cout << x->m << endl;
	cout << x1->m << endl;
}
真相重于对错 2020-04-10
  • 打赏
  • 举报
回复
提供默认构造函数啊

65,182

社区成员

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

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