派生类中的重载构造函数
Posted
技术标签:
【中文标题】派生类中的重载构造函数【英文标题】:Overloaded constructor in derived class 【发布时间】:2014-07-09 20:00:40 【问题描述】:我有基类Manager
和派生类Worker
,继承似乎工作正常——我使用它的默认构造函数创建了派生类的新对象,并且可以正确输出。
但是现在我想为派生类(Worker
)创建一个重载的构造函数,并且似乎存在编译错误,我很想寻找答案但我没有找到答案。
为什么编译器说Worker
没有id、name 和salary 字段?我已经按本书创建了一个派生类,并为它创建了 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
【问题讨论】:
类应该负责初始化它们自己的成员。委托给Manager
构造函数。
为什么Worker的构造函数没有在其初始化列表中调用Manager的构造函数?
不是您问题的主题,但您的模型似乎不适合继承。根据您的方案,任何工人都是经理(可以在任何地方使用工人而不是经理),这不太正确。
@bolov 我只是为实验做了这个,但经理仍然有一个工人没有的特质 (clearance
),这决定了他们之间的区别。
【参考方案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、name、salary和clearance。您需要将其传递给基类构造函数进行初始化。您不能直接初始化它们。id
、name
和 clearance
受到保护,因此您可以在派生类中访问它们,但不能使用初始化列表直接初始化它们。你可以initialize inside the constructor
或make 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
【讨论】:
感谢您的回答,我使用它并且它有效。如果有可能你会向我解释更多关于构造函数的委托。据我了解,来自Worker
ctor 的变量被传递给Manager
ctor。【参考方案2】:
派生类看不到其基类的私有成员。你必须委托构造函数。
【讨论】:
【参考方案3】:你的 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)
【讨论】:
以上是关于派生类中的重载构造函数的主要内容,如果未能解决你的问题,请参考以下文章
在派生构造函数中的某些代码块之后调用派生类中的基类构造函数[重复]
与默认构造函数有关,CMFCPropertyGridProperty的派生类构造函数怎么写