簡體   English   中英

C ++繼承中的構造方法重載問題

[英]Constructor Overload Problem in C++ Inheritance

這是我的代碼段:

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;         
}

調用覆蓋的LoginRequest的構造方法時

LoginRequest *test=new LoginRequest(doc);

我想出了這個結果:

Request:  Hello World
LoginRequest:  Hello World with QDomDocument
Request:  Hello World
LoginRequest:  Hello World

顯然,LoginRequest的兩個構造函數都稱為REquest構造函數。

有什么辦法可以應付這種情況?

我可以構造另一個函數來完成我想做的工作,並讓兩個構造函數都調用該函數。 但是我想知道有什么解決辦法嗎?

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

代碼沒有執行您可能認為正在執行的操作。 該行:

 LoginRequest::LoginRequest();     

構造一個立即被銷毀的臨時對象。 正如其他人所建議的那樣,您可以將重復的代碼放在私有函數中,但這存在很多問題-特別是,這樣的函數只能執行賦值,而不能初始化,並且許多類都不支持賦值。 更好的解決方案是使用默認參數實現單個構造函數:

class LoginRequest {
   ....
   LoginRequest( QDomDocument d = DefaultDoc() );
};

是的,使用函數並從兩個構造函數調用它的解決方案是一個很好的解決方案(可能更好:將類層次結構設為Request-LoginRequest-LoginRequestWithDoc)。

C#提供了您需要/嘗試實現的功能,但C ++沒有提供:類的ctor調用同一類的另一個ctor。

class LoginRequest
{
  public LoginRequest()
  {
    // ...
  }

  public LoginRequest( Document doc )
    : this()   // <<< order of execution: Request() -> LoginRequest()
               //                         -> LoginRequest( doc )
  {
    // ...
  }
}

我可以構造另一個函數來完成我想做的工作,並讓兩個構造函數都調用該函數。 但是我想知道有什么解決辦法嗎?

就在這里:

首先,將用於初始化的代碼移到初始化列表中。 這是更有效和更好的編碼實踐。

其次,任何對兩個構造函數都通用而不是初始化的代碼(即,不能將其放在初始化列表中)應移至一個通用私有函數,並從兩個構造函數中調用。

通常,從另一個構造函數調用一個構造函數是不好的,因為-取決於編譯器在做什么,您可能會有奇怪/未定義的行為(在這種情況下,基類將初始化兩次)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM