2012-10-13 36 views
3

我的父類,當然,有方法傳遞addStudent(學生或多個)。我的孩子課程BetterCourse繼承了課程。每次我嘗試運行BetterCourse.addStudent(S),我收到以下錯誤:C++繼承 - 在子類中運行父方法

error: no matching function for call to ‘BetterCourse::addStudent(Student (&)())’ note: candidates are: void Course::addStudent(Student)

我的理解是在告訴我傳遞addStudent()尚未在BetterCourse被定義,它的建議我使用一個存在在父類課程中。這有我困惑圍繞繼承的整體思路是不需要重新定義繼承函數和變量。

過程如下:

#include <iostream> 
#include <string> 
#include "Student.h" 

using namespace std; 

class Course 
{ 

    protected: 
     string id; 
     string name; 

    public: 
     Course(); 
     Course(string id, string name);  
     void addStudent(Student s); 
}; 

Course::Course() 
{ 
    //code 
} 

Course::Course(string id, string name) 
{ 
    //code 
} 

void Course::addStudent(Student s) 
{ 
    //code 
} 

BetterCourse:

#include <iostream> 
#include <string> 
#include "Course.h" 

using namespace std; 

class BetterCourse : public Course 
{ 
    public: 
     BetterCourse(string id, string name) : Course(id,name){}; 
}; 
+0

在哪一行,你得到的錯誤?我沒有看到任何添加學生的電話,所以很難說出你想要做什麼。 – Cheezmeister

+0

不要忘了'virtual'成員函數。 http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/topic/com.ibm.xlcpp8a.doc/language/ref/cplr139.htm –

+0

爲什麼你需要虛擬方法,如果你想使用實現從基類? –

回答

4

從你的錯誤似乎是你第一次到C的最醜陋的部分++。

此:

Student s(); 

是函數的聲明 - 不反對的定義。 s類型是Student (*)()所以,當你撥打:

BetterCourse bc; 
bc.addStudent(s); 

你得到你的錯誤 - 你沒有辦法增加學生返回功能。

在以下幾個方面定義學生:

Student s; 
Student s {}; // new C++11 way 
Student s = Student(); // 
+0

如何在線條之間閱讀! +1 – Cheezmeister

+0

你是非常正確的!雖然我已經爲處理空參數創建的Student定義了構造函數,但我沒有設計addStudent()來處理「空」對象。我已經添加了適當的參數,錯誤消失了。謝謝:) –

+0

我很樂意提供幫助。不要忘記接受;) – PiotrNycz

0

這聽起來像你實際上調用與不適當的參數的函數 '傳遞addStudent'。你能否顯示實際上在BetterCourse對象上調用addStudent的代碼?這聽起來像你正在使用對學生的引用而不是學生對象本身。

0

你不能叫BetterCourse.addStudent(S),你應該創建一個對象

BetterCourse obj; 
obj.addStudent(s); 

應該工作

如果你想打電話BetterCourse ::傳遞addStudent(S)比申報傳遞addStudent(S)靜態方法