C++继承中的构造函数重载问题

met*_*dos 0 c++ inheritance constructor overloading

这是我的代码片段:

class Request
{
public:
 Request(void);
………..
}

Request::Request(void)
{
 qDebug()<<"Request: "<<"Hello World";
}


class LoginRequest :public Request
{
public:
 LoginRequest(void);
 LoginRequest(QDomDocument);
……………
}

LoginRequest::LoginRequest(void)
{
 qDebug()<<"LoginRequest: "<<"Hello World";
 requestType=LOGIN;
 requestId=-1;   
}

LoginRequest::LoginRequest(QDomDocument doc){
 qDebug()<<"LoginRequest: "<<"Hello World with QDomDocument";
 LoginRequest::LoginRequest();       
 xmlDoc_=doc;         
}
Run Code Online (Sandbox Code Playgroud)

当调用Overrided LoginRequest的构造函数时

LoginRequest *test=new LoginRequest(doc);
Run Code Online (Sandbox Code Playgroud)

我想出了这个结果:

Request:  Hello World
LoginRequest:  Hello World with QDomDocument
Request:  Hello World
LoginRequest:  Hello World
Run Code Online (Sandbox Code Playgroud)

显然,LoginRequest的构造函数都调用了REquest构造函数.

有没有办法解决这种情况?

我可以构造另一个函数来完成我想要做的工作,并让两个构造函数都调用该函数.但我想知道有什么解决方案吗?

编辑:http: //www.parashift.com/c++-faq-lite/ctors.html#faq-10.3

小智 6

代码没有做你认为它正在做的事情.这条线:

 LoginRequest::LoginRequest();     
Run Code Online (Sandbox Code Playgroud)

构造一个立即销毁的临时对象.正如其他人所建议的那样,你可以将重复的代码放在私有函数中,但这有很多问题 - 具体来说,这样的函数只能执行赋值,而不能初始化,而且许多类不支持赋值.一个更好的解决方案是使用默认参数实现单个构造函数:

class LoginRequest {
   ....
   LoginRequest( QDomDocument d = DefaultDoc() );
};
Run Code Online (Sandbox Code Playgroud)