派生类中的重载构造函数

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;
;

Managercpp:

#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

Workercpp:

#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。您需要将其传递给基类构造函数进行初始化。您不能直接初始化它们。idnameclearance 受到保护,因此您可以在派生类中访问它们,但不能使用初始化列表直接初始化它们。你可以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

【讨论】:

感谢您的回答,我使用它并且它有效。如果有可能你会向我解释更多关于构造函数的委托。据我了解,来自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)


【讨论】:

以上是关于派生类中的重载构造函数的主要内容,如果未能解决你的问题,请参考以下文章

c++中的虚函数有啥作用?

在派生构造函数中的某些代码块之后调用派生类中的基类构造函数[重复]

派生类中的基本构造函数调用

与默认构造函数有关,CMFCPropertyGridProperty的派生类构造函数怎么写

与默认构造函数有关,CMFCPropertyGridProperty的派生类构造函数怎么写

重载赋值运算符 - 多态容器