C++继承问题

C++继承问题,c++,inheritance,C++,Inheritance,我有一些关于继承的问题。我有一类人,一类学生:人,雇员:人。我所犯的错误让我困惑——我不明白为什么我会犯这些错误。我使用了tiny paste来粘贴代码,因为我认为这会占用太多的空间。如果我把问题贴到别处,请告诉我。谢谢 代码文件: main.cpp– 人。h—— Person.cpp– 学生h- Student.cpp- 雇员。h—— Employee.cpp– 以下是我得到的错误: 1>------ Build started: Project: PR4_Students, Confi

我有一些关于继承的问题。我有一类人,一类学生:人,雇员:人。我所犯的错误让我困惑——我不明白为什么我会犯这些错误。我使用了tiny paste来粘贴代码,因为我认为这会占用太多的空间。如果我把问题贴到别处,请告诉我。谢谢

代码文件:

main.cpp– 人。h—— Person.cpp– 学生h- Student.cpp- 雇员。h—— Employee.cpp– 以下是我得到的错误:

1>------ Build started: Project: PR4_Students, Configuration: Debug Win32 ------
1>Build started 2/18/2012 11:14:27 PM.
1>InitializeBuildStatus:
1>  Touching "Debug\PR4_Students.unsuccessfulbuild".
1>ClCompile:
1>  main.cpp
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(15): error C2969: syntax error : ';' : expected member function definition to end with '}'
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(16): error C2059: syntax error : 'inline function header'
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(16): error C2630: ';' found in what should be a comma-separated list
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(15): error C2969: syntax error : ';' : expected member function definition to end with '}'
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(16): error C2059: syntax error : 'inline function header'
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(16): error C2630: ';' found in what should be a comma-separated list
1>  Student.cpp
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(15): error C2969: syntax error : ';' : expected member function definition to end with '}'
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(16): error C2059: syntax error : 'inline function header'
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(16): error C2630: ';' found in what should be a comma-separated list
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.cpp(8): error C2084: function 'Student::Student(void)' already has a body
1>          \\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(15) : see previous definition of '{ctor}'
1>  Employee.cpp
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(15): error C2969: syntax error : ';' : expected member function definition to end with '}'
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(16): error C2059: syntax error : 'inline function header'
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(16): error C2630: ';' found in what should be a comma-separated list
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.cpp(8): error C2084: function 'Employee::Employee(void)' already has a body
1>          \\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(15) : see previous definition of '{ctor}'
1>  Generating Code...
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:05.64
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

在学生的第15行。h:

Student() : Person();
那是无效的。要么需要在那里完全定义构造函数,要么根本不定义

因此:

或:


并将实际代码放入实现文件中。

在Students的第15行。h:

Student() : Person();
那是无效的。要么需要在那里完全定义构造函数,要么根本不定义

因此:

或:


并将实际代码放在实现文件中。

我没有分析整个代码,但您似乎对如何声明对基类构造函数的调用感到困惑

class Student : public Person
{
...
    Student() : Person();
...
};
对基类构造函数的调用应该只在构造函数的实际实现上完成。既然你已经和我一起做了

Student::Student() : Person() {
您只需将声明更改为

class Student : public Person
{
...
    Student();
...
};
事情应该会变得更好

编辑:添加以下后续问题的答案

线路

Employee(string department, string jobTitle, int yearOfHire) 
  : Person(name, socialSecurityNumber, age, gender, address, phoneNumber) {
出于同样的原因,这真的没有意义。如果希望能够使用所有这些参数构造Employee,则需要将构造函数声明为

Employee(string department, string jobTitle, int yearOfHire, name, 
         socialSecurityNumber, age, gender, address, phoneNumber) {
并作为

Employee::Employee(string department, string jobTitle, int yearOfHire, name, 
         socialSecurityNumber, age, gender, address, phoneNumber) 
  : Person(name, socialSecurityNumber, age, gender, address, phoneNumber) {

因此,将参数传递给基类构造函数。

我没有分析整个代码,但您似乎对如何声明对基类构造函数的调用感到困惑

class Student : public Person
{
...
    Student() : Person();
...
};
对基类构造函数的调用应该只在构造函数的实际实现上完成。既然你已经和我一起做了

Student::Student() : Person() {
您只需将声明更改为

class Student : public Person
{
...
    Student();
...
};
事情应该会变得更好

编辑:添加以下后续问题的答案

线路

Employee(string department, string jobTitle, int yearOfHire) 
  : Person(name, socialSecurityNumber, age, gender, address, phoneNumber) {
出于同样的原因,这真的没有意义。如果希望能够使用所有这些参数构造Employee,则需要将构造函数声明为

Employee(string department, string jobTitle, int yearOfHire, name, 
         socialSecurityNumber, age, gender, address, phoneNumber) {
并作为

Employee::Employee(string department, string jobTitle, int yearOfHire, name, 
         socialSecurityNumber, age, gender, address, phoneNumber) 
  : Person(name, socialSecurityNumber, age, gender, address, phoneNumber) {

因此将参数传递给基类构造函数。

欢迎来到C++社区,米迦勒!将来,通过在作业相关问题上加上标签来获得布朗尼分数。学生:人;这是错误的。您只需要在构造函数的定义中提供初始值设定项列表,而不需要在声明中提供。试着做一个学生;。欢迎来到C++社区,米迦勒!将来,通过在作业相关问题上加上标签来获得布朗尼分数。学生:人;这是错误的。您只需要在构造函数的定义中提供初始值设定项列表,而不需要在声明中提供。试着做一个学生;。在实现文件中可以有默认构造函数和覆盖构造函数吗?我认为被覆盖的构造函数应该在头文件中。我不明白你的问题-什么是被覆盖的构造函数?除非您处理的是模板,否则您可以自由地将内容放在头文件或实现文件中。你不能做的是像你那样的部分构造函数定义。我懂了。我说的是:学生,学生年龄,学生字符串名称,int年龄。我被告知除了学生以外的任何东西都需要在.h文件中。但是根据你说的,它们实际上应该在.cpp文件中?是的。您需要在头中包含所有声明原型,但可以将定义代码放入.cpp文件中。只要不涉及模板。如果你想让我在.ccp中有这一行,那么告诉我在.h中需要什么,因为我尝试的每件事都会在标题中给我一个错误代码:Employeestring name、int socialSecurityNumber、int age、char性别、字符串地址、int phoneNumber、字符串部门、字符串jobTitle、,int Yearofher:Personname、socialSecurityNumber、年龄、性别、地址、电话号码{this->department=department;this->jobTitle=jobTitle;this->Yearofher=Yearofher;}在实现文件中可以有默认构造函数和覆盖的构造函数吗?我认为被覆盖的构造函数应该在头文件中。我不明白你的问题-什么是被覆盖的构造函数?除非您处理的是模板,否则您可以自由地将内容放在头文件或实现文件中。你不能做的是像你那样的部分构造函数定义。我懂了。我说的是:学生,学生年龄,学生字符串名称,int年龄。我被告知除了学生以外的任何东西都需要在.h文件中。但是根据你说的,它们实际上应该在.cpp文件中?是的。您需要在头中包含所有声明原型,但可以将定义代码放在头中
cpp文件。只要不涉及模板。如果你想让我在.ccp中有这一行,那么告诉我在.h中需要什么,因为我尝试的每件事都会在标题中给我一个错误代码:Employeestring name、int socialSecurityNumber、int age、char性别、字符串地址、int phoneNumber、字符串部门、字符串jobTitle、,个人姓名、社会安全号码、年龄、性别、地址、电话号码{this->department=department;this->jobTitle=jobTitle;this->yearofher=yearofher;}谢谢。如何使用Person和Student参数创建Student对象?可能完全误解了您的问题,但要让它调用Person构造函数并将参数传递给Student构造函数,只需将实现行更改为Student::StudentAge:Personage即可{.当然,Person也需要一个构造函数来调用年龄作为参数.让我给你一个例子.目前我认为IDE需要这个代码:personVector.push_backnew EmployeeSales,VP,2008;然而我认为它是这样的:personVector.push_backnew EmployeeSales,VP,2008,John,123456789,19,'m',Unknown,3218424222;@michaellindahl为上述答案添加了一个示例。谢谢。我如何使用Person和Student参数创建Student对象?可能完全误解了您的问题,但要让它调用Person构造函数并将参数传递给Student构造函数,只需将实现行更改为Student::Studentent年龄:名人{.当然,Person也需要一个构造函数来调用年龄作为参数.让我给你一个例子.目前我认为IDE需要这个代码:personVector.push_backnew EmployeeSales,VP,2008;然而我认为它是这样的:personVector.push_backnew EmployeeSales,VP,2008,John,123456789,19,'m',Unknown,3218@michaellindahl为上述答案添加了一个例子。