2010-07-23 39 views
6

我正在編寫一個C++程序,它將擲骰子並翻轉硬幣。我需要使用繼承和多態。我的虛擬功能設置正確。在我的基類(aRandomNumberGenerator)中,我有一個虛函數generate。在main()我需要有一個2基類指針數組到我的派生類(aDie和aCoin)。當我調用generate()函數時,如何知道數組中指向哪個派生類?如何確定使用指針數組時指向哪個派生類

代碼:

int main() 
{ 
    int n; 
    int frequency1 = 0; // count of 1s rolled 
    int frequency2 = 0; // count of 2s rolled 
    int frequency3 = 0; // count of 3s rolled 
    int frequency4 = 0; // count of 4s rolled 
    int frequency5 = 0; // count of 5s rolled 
    int frequency6 = 0; // count of 6s rolled 
    int face; // stores most recently rolled value 
    int numHeads = 0; // count of heads 
    int numTails = 0; // count of tails 
    int side; // stores most recently flipped value 

    cout << "Enter a seed number: "; // promp for user to enter a seed number 
    cin >> n; 
    cout << endl; 
    cout << endl; 

    aRandomNumberGenerator number(n); 
    aDie die(n, n); 
    aCoin coin(n, n); 

    aRandomNumberGenerator *games[2]; // array of 2 base class pointers 

    for(int i=0; i <= 2; i++) 
     games[i]->generate(); 


    // output the seed number entered by the user 
    cout << "the seed entered is: " << die.inputSeed(n) << endl; 
    cout << endl; 
    cout << endl; 

    // summarize results for 600 flips of a coin 
    for(int counter2 = 0; counter2 < 600; counter2++) 
    { 
     side = generate(); 

     // determine flip value 0/1 and increment appropriate counter 
     switch (side) 
     { 
     case 0: 
      ++numHeads; 
      break; 
     case 1: 
      ++numTails; 
      break; 
     default: 
      cout << "can only be heads or tails"; 
     } 
    } 

    // summarize results for 600 rolls of a die 
    for(int counter1 = 0; counter1 < 600; counter1++) 
    { 
     face = generate(); 

     // determine roll value 1-6 and increment appropriate counter 
     switch (face) 
     { 
     case 1: 
      ++frequency1; 
      break; 
     case 2: 
      ++frequency2; 
      break; 
     case 3: 
      ++frequency3; 
      break; 
     case 4: 
      ++frequency4; 
      break; 
     case 5: 
      ++frequency5; 
      break; 
     case 6: 
      ++frequency6; 
      break; 
     default: 
      cout << "7 doen't exist on a die!"; 
     } 
    } 

    // output results 
    cout << "Heads: " << numHeads << endl; 
    cout << "Tails: " << numTails << endl; 
    cout << "1: " << frequency1 << endl; 
    cout << "2: " << frequency2 << endl; 
    cout << "3: " << frequency3 << endl; 
    cout << "4: " << frequency4 << endl; 
    cout << "5: " << frequency5 << endl; 
    cout << "6: " << frequency6 << endl; 

    cout << endl; 
    cout << endl; 
    system ("pause"); 
    return 0; 
+3

整點of.using多態性是侯沒有to.worry約在所有 – 2010-07-23 19:22:07

回答

8

使用的dynamic_cast。

if (Derived1* ptr = dynamic_cast<Derived1*>(basepointer)) { 
    // Do something with ptr 
} 

但是,對於常規方法調用,您不需要確定它。只需在基類上調用該方法,它就會被分派到正確的派生類 - 這就是繼承的用途。

編輯:對於常規的虛擬方法,你可以在基指針上調用它,不知道或在意Derived是什麼,你會得到正確的函數調用。

3
aRandomNumberGenerator *games[2]; // array of 2 base class pointers 

for(int i=0; i <= 2; i++) 
    games[i]->generate(); 

首先,讓我們在處理其他事情之前讓它工作。

您正在創建一個數組,它將保存指向兩個aRandomNumberGenerator對象的指針,但您從不自己創建aRandomNumberGenerator對象。 games[0]games[1]保持無意義的值。此外,在循環中,您還可以訪問不存在的games[2]

UPDATE: 出於某種原因,其他的回答者,決定使用的代碼,這是我討厭的離奇簡寫版,並有可能混淆任何經驗的C++代碼(其中OP顯然是),讓我們做自己:

Derived1* ptr = dynamic_cast<Derived1*>(basepointer) 
if (ptr != null) 
{ 
    // Do something with ptr 
} 
+0

我固定我的for循環的類型,我需要創建一個像普通的對象,每個對象?還有什麼dynamic_cast代碼? ex。 aRandomNumberGenerator遊戲[0] =&aCoin aRandomNumberGenerator遊戲[1] =&aDie – user400586 2010-07-23 20:00:24

+0

我使用了縮短版本,因爲它確保ptr從不被誤用,如果它不是Derived1。如果OP不是經驗豐富的C++編碼器,則這是額外的保護級別。 – Puppy 2010-07-23 20:19:09

0

你可以使用RTTI(typeid的和dynamic_cast的),或者增加一個虛函數,在實施中,標識類(滾動自己RTTI)。

通常,如果您可以避免這種情況,除了實現本身之外,添加與實現相關的代碼(代碼關心的是確切類型)被認爲是不好的做法。通過「實現」,我不只是指特定的派生類,我還指的是特定於該實現的配對/相關類。

嘗試通過多態性將特定於您的確切實現的switch/else-if語句滾動到實現中。

http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.6

相關問題