【问题标题】:Dealing with constructors when using inherited classes使用继承类时处理构造函数
【发布时间】:2014-04-30 04:09:21
【问题描述】:

我是类的新手,我试图了解构造函数在被继承的类在另一个中使用时是如何工作的。 所以在我的项目中,我有 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 对象不同)。 我试图了解这里发生了什么。我希望我说清楚了,我为这样一个延伸的问题道歉。提前致谢。

【问题讨论】:

  • @JoachimPileborg 好的。但如果我这样做了,为什么它不起作用?

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


【解决方案1】:

你有两个问题:

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

  2. letter 类已经是一个 postalService 类,这意味着您不需要创建postalService 类的单独实例并且将其作为参数传递。因为这样继承的字段将为空(您永远不会在 letter 实例中设置它们)。

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

【讨论】:

  • 因此,如果我想一次填充所有数据,可以这样编写构造函数: letter:letter(string add, date d, bool reg_ship, string sen): postalService(add , d), registred_shipment(reg_ship), 发件人(sen) {...} ?我做了相反的事情,因为我试图避免构造函数中的许多变量。非常感谢您的帮助:)
【解决方案2】:

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

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

如果你的类 Date 有一些指针作为成员,还要检查 Date 复制构造函数是否定义良好(深拷贝)。

【讨论】:

  • 感谢您的帮助。我不知道我是怎么错过的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2018-09-29
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多