2014-07-09 54 views
1

我有基類Manager和派生類Worker,繼承似乎正常工作 - 我創建了派生類的新對象,使用它的默認構造函數,我可以正確輸出。 但現在我想爲派生類(Worker)做一個重載的構造函數,似乎有一個編譯錯誤,我厭倦了尋找答案,但我沒有找到答案。 爲什麼編譯說Worker沒有ID,名稱和薪水字段?我在書中創建了一個派生類,併爲它創建了ctors。派生類中的重載構造函數

Manager頭:

#include <string> 
#ifndef MANAGER_H 
#define MANAGER_H 

class Manager 
{ 
public: 
    Manager(); //ctor 
    Manager (std::string, std::string, float, int); //overloaded ctor 
    friend void display (Manager&); //friend function is declared 
    ~Manager(); //dtor 
protected: 
    std::string id; 
    std::string name; 
    float salary; 
private: 
    int clearance; 
}; 

Manager CPP:

#include <iostream> 
#include "Manager.h" 
#include "Worker.h" 

Manager::Manager() //default ctor 
{ 
id = "M000000"; 
name = "blank"; 
salary = 0; 
clearance = 0; 
} 

Manager::Manager(std::string t_id, std::string t_name, float wage, int num): id (t_id), name  (t_name), salary(wage), clearance (num) 
{ 
//overloaded ctor 
} 

Manager::~Manager() 
{ 
//dtor 
} 

Worker頭:

#include <string> 
#ifndef Worker_H 
#define Worker_H 

class Worker: public Manager 
{ 
public: 
    Worker(); 
    Worker (std::string, std::string, float, int); 
    ~Worker(); 
    friend void display (Worker&); //friend function is declared 
protected: 
    int projects; 
private: 

}; 

#endif // Worker_H 

Worker CPP:

#include <iostream> 
#include "Manager.h" 
#include "Worker.h" 

Worker::Worker() //default ctor 
{ 
id = "w000000"; 
name = " - "; 
salary = 0; 
projects = 0; 

} 
Worker::Worker(std::string t_id, std::string t_name, float wage, int num) : id (t_id), name (t_name), salary (wage), projects (num); 
{ 
//ctor 
} 
Worker::~Worker() 
{ 
//dtor 
} 
+0

類應該負責初始化自己的成員。委託給一個'Manager'構造函數。 – chris

+0

爲什麼Worker的構造函數在其初始化列表中調用Manager的構造函數? –

+0

不是你的問題的主題,但你的模型似乎不適合繼承。按照你的計劃,任何工人都是經理(工人可以在任何地方使用,而不是經理),這是不正確的。 – bolov

回答

1
Worker::Worker(std::string t_id, std::string t_name, float wage, int num) : id (t_id), name (t_name), salary (wage), projects (num) 
{ 
//ctor 
} 

這裏您初始化基類中定義的成員id,名稱,工資和清除。您需要將它傳遞給基類構造函數進行初始化。你不能直接初始化它們。
id,nameclearance受保護,因此您可以在派生類中訪問它們,但不能使用初始化列表直接初始化它們。你可以initialize inside the constructormake a call to base constructor in initialization list

Worker::Worker(std::string t_id, std::string t_name, float wage, int num):Manager(t_id,t_name,wage,0), projects (num) 
{ 
//ctor 
} 
+0

感謝您的回答,我使用它,它工作。 如果有可能你會向我解釋更多關於構造函數的授權。 據我所知,來自'Worker'的變量被傳遞給'Manager' ctor。 – Medvednic

0

派生類沒有看到其基類的私有成員。你必須委託構造函數。

0

Worker構造函數應該是這樣的:

Worker::Worker() : Manager("w000000", " - ", 0, 0) {} 

Worker::Worker(std::string t_id, std::string t_name, float wage, int num) : 
    Manager(t_id, t_name, wage, num) 
{ 
} 
相關問題