我是类的新手,我试图理解构造函数在继承类中使用时是如何工作的。 所以在我的项目中我有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
对象中的不同)。
我想知道这里发生了什么。我希望我清楚自己,并为这个问题深表歉意。提前谢谢。
答案 0 :(得分:2)
你有两个问题:
您在特定postalService
构造函数中调用的letter
复制构造函数不执行任何操作。这意味着它不会设置任何东西。
已经 的letter
类是 postalService
类,这意味着您不会创建单独的实例postalService
类并将其作为参数传递。因为那时继承的字段将为空(您从未在letter
实例中设置它们。)
如果要设置postalService
成员变量,则需要在letter
类中创建适当的构造函数,并在其初始化列表中调用postalService
类中的相应构造函数
答案 1 :(得分:1)
继承的变量是空的,因为postalService类的复制构造函数不进行任何复制:
postalService::postalService(const postalService& p) {
}
您应该将其替换为:
postalService::postalService(const postalService& p) : address(p.address), date(p.date) {
}
如果您的类Date有一些指针作为成员,请检查日期复制构造函数是否已明确定义(深层复制)。