2014-01-06 110 views
2

我在处理这个错误时遇到了一些麻烦。所以我有一个Person类和一个Student子类。C++继承获取错误

Person类具有下面的构造:

Person(const string &name) 
     { this->name = name; 
     } 

学生类具有以下构造:

Student::Student(const string &name, int regNo) 
{ this->name = name; 
    this->regNo = regNo; 
} 

当我尝试虽然编译Student类,我得到这个错误的构造函数:

In constructor 'Student::Student(const string&, int)':

error: no matching function for call to 'Person::Person()'

我是新来的C++,所以我不知道为什么我得到这个呃但是这显然与人的继承有关。

回答

11

您正试图呼叫Person的默认构造函数,但它没有一个。在任何情况下,它看起来像你想要做的就是调用其单个参数的构造函数是什么:

Student::Student(const string& name, int regNo) : Person(name), regNo(regNo) 
{ 
} 

同样,在Person的consructor使用构造函数初始化列表:

Person(const string& name) : name(name) {} 

这样,你初始化您的数据成员到所需的值,而不是默认初始化它们,然后分配他们的新值。

6

你需要从基类委托给正确的构造函数是这样的:

Student::Student(const string &name, int regNo) 
    : Person(name) 
{ 
    this->regNo = regNo; 
} 

注意,这里使用初始化列表,这样你就可以使用更地道

Student::Student(const string &name, int regNo) 
    : Person(name), regNo(regNo) 
{ 
} 

,为Person ctor:

Person(const string &name) 
    : name(name) 
{ 
} 

初始化程序列表用于初始化基类和成员变量,你没有明确地放在那里的所有东西都是默认构造的(并且在你的代码中,它稍后分配在ctor的主体中)。由于Person不是默认可构造的,因此您的必须在初始化程序列表中初始化它。