使用继承类时处理构造函数

时间:2014-03-22 18:22:18

标签: c++ class copy-constructor composition default-constructor

我是类的新手,我试图理解构造函数在继承类中使用时是如何工作的。 所以在我的项目中我有2个班级。例如,一个是postalService:

class postalService {
private:
    string address;
    Date date //I used another class Date (composition)
public:
    postalService();
    postalService(string a, int b, int c, int d);
    postalService(const postalService& p);
    ~postalService();
}

使用构造函数:

postalService::postalService():address(""), date(){
}
postalService::postalService(string a, int b, int c, int d):address(a), date(b,c,d){
}
postalService::postalService(const postalService& p) {
}
postalService::~postalService(){
}

然后另一个类是Letter,它由类postalService继承:

class letter : public postalService {
private:
    bool registered_shipment;
    string sender;
public:
    letter();
    letter(postalService& a, bool b, string c);
    letter(const letter& p);
    ~letter();

使用构造函数:

letter::letter():postalService(), registered_shipment(false), sender("") { 
}
letter::letter(const letter& p):postalService(p), registered_shipment(p.registered_shipment), sender(p.sender) { 
}
letter::letter(postalService& a, bool b, string c):postalService(a), registered_shipment(b), sender(c){ 
}
letter::~letter(){  
}

现在,当我尝试下面的代码时,如果我创建一个名为service的postalService对象(不是默认构造函数),并尝试使用以下构造函数将其包含在我的对象中:letter::letter(postalService& a, bool b, string c):postalService(a), registered_shipment(b), sender(c){ }

letter my_letter(service, true, "John Smith");

每个继承的变量都是空的(与service对象中的不同)。 我想知道这里发生了什么。我希望我清楚自己,并为这个问题深表歉意。提前谢谢。

2 个答案:

答案 0 :(得分:2)

你有两个问题:

  1. 您在特定postalService构造函数中调用的letter复制构造函数不执行任何操作。这意味着它不会设置任何东西。

  2. 已经 letter类是 postalService类,这意味着您不会创建单独的实例postalService类并将其作为参数传递。因为那时继承的字段将为空(您从未在letter实例中设置它们。)

  3. 如果要设置postalService成员变量,则需要在letter类中创建适当的构造函数,并在其初始化列表中调用postalService类中的相应构造函数

答案 1 :(得分:1)

继承的变量是空的,因为postalService类的复制构造函数不进行任何复制: postalService::postalService(const postalService& p) { }

您应该将其替换为: postalService::postalService(const postalService& p) : address(p.address), date(p.date) { }

如果您的类Date有一些指针作为成员,请检查日期复制构造函数是否已明确定义(深层复制)。