2014-05-01 65 views
1

我有A類:C++繼承,構造真實主叫

class A 
{ 
    A(const String& name) 
    { 
     doSomething1(); 
    } 
} 

而且我也有B類

class B : A 
{ 
    B(const String& name): A(name) 
    { 
     doSomething2(); 
    } 
} 

所以,如果我叫B(),它也將調用A(),它將會產生2x調用doSomething()。 有沒有什麼辦法如何在A的構造函數中發現它是直接調用的:A()和間接時:B()?

感謝

編輯: 好吧好吧,這是不一樣的方法DoSomething的(),它更像doSomething1()和了doSomething2(),但我想呼籲的最外面的功能,所以如果A有doSomething1 ()和B了doSomething2()調用B之後()我想只執行了doSomething2()

+0

沒有黑客,沒有。我想這個設計是錯的。 – cubuspl42

+3

不要打擊類型系統。讓它工作*爲*你。 –

+2

我有這樣的感覺,你要求一個XY問題,如果不僅僅意味着一個學術問題。 –

回答

3

一般來說,如果您所指的對象是派生類型,則無法從基類中發現。

反正你的設計是最有可能有缺陷,這樣的事情也可以工作:通過利用構造的知名度

#include <iostream> 
#include <string> 
using namespace std; 

class A 
{ 
public: 
    A(const string& name) 
    { 
     doSomethingFromA(); 
    } 

    void doSomethingFromA() { 
     cout << "called from A" << endl; 
    }; 
protected: 
    A(const string& name, bool fromB) 
    { 
     doSomethingFromB(); 
    } 

    void doSomethingFromB() { 
     cout << "called from B" << endl; 
    }; 
}; 

class B : public A 
{ 
    public: 
    B(const string& name): A(name, true) 
    { 
    } 

}; 


int main() { 

    A obj1("str"); 

    B obj2("str"); 

    return 0; 
} 

http://ideone.com/jj8Df1

你可能會傳遞給基類的附加信息。否則,我會建議使用稍微修改的CRTP,它使您的基類知道對象本身(它們成爲完全不同的實體)。

+0

謝謝我知道你在代碼中描述的第一個選項,可能它會以我如何實現它的方式。問題是我添加了一些東西到現有的項目,其中有cca 5000文件,我可以做的只是改變,這不會導致需要重新編譯用該代碼編寫的項目....但如果我使用默認參數值,它應該一切工作很好...... –

0

你可以有doSomething兩個重載如下但是......

void doSomething(A*); 
void doSomething(B*); 

而在電話會議上的網站,你這樣做:

doSomething(this); 

this或者是A*B*所以它會調用相應的函數)

class A 
{ 
    A(const String& name) 
    { 
     doSomething(this); 
    } 
} 

class B : A 
{ 
    B(const String& name): A(name) 
    { 
     doSomething(this); 
    } 
} 

,其他的評論說,你有一個設計問題!

+0

請參閱我的編輯 –