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)