2011-03-04 44 views
1

我知道這可能是非常愚蠢的,但一個人如何做到繼承類C++向前引用

的正向基準像

class parent 
{ 
...stuff in here 
} 


class child1 : public parent 
{ 
.... 
} 

class child2 : public parent 
{ 
.... 
} 

所有類都必須在同一個文件,我使用child1內部的child2實例,反之亦然。我如何在這裏做前向引用?如果我只是說

class child2; 

的代碼編譯器不認識到這是父母的一個子類,當我使用它在child1的開始(因此虛擬功能不起作用)。請幫忙。

+2

你是什麼意思「使用child2的實例?」如果你的意思是實際的對象,你不能用前向聲明來做到這一點。你只能使用指針和引用。 – Maxpm 2011-03-04 14:16:52

+0

@Maxpm:如果他停止在類定義中內聯寫入函數體,他可以在函數體中使用實例。 :)的確,前向聲明只給他指針/引用的用法 - 在函數聲明中可能有用。 – 2011-03-04 14:23:57

回答

0

嘗試

class child1 
{ 
    ... 
    class child2 *c; 
    ... 
}; 

class child2 
{ 
    ... 
    class child1 *c; 
    ... 
}; 
+0

有關正向聲明及其用法的更多信息,請參閱[C++ FAQ](http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.11) – maverik 2011-03-04 14:20:30

0

你說的是前向聲明,而不是轉發引用。

所有類都必須在同一個 文件,我使用的是內部child1和副詩句的child2 實例。我如何 在這裏做前向引用?如果我 只是說

class child2; 

的代碼開頭的 編譯器無法識別,這是 父的子類,當我使用它在 child1(因此虛擬 功能不起作用)。請幫忙。

您不能通過前向聲明「使用」它。你建議使用前向聲明:

class child2; 

,這樣就可以在一些.cpp文件聲明函數的類,然後定義函數體。

1

添加了所有的意見到一個編譯例子,我們有:

#include <iostream> 


class parent { 
private: 
    int m_baseData; 
public: 
    parent(int myData) : m_baseData(myData) {} 
    int GetData() { return m_baseData; } 
}; 

class child2; 

class child1 : public parent { 
private: 
    child2 *m_pChild2; 
public: 
    int GetSiblingData(); /* { return m_pChild2->m_baseData; } */ 
    child1(int myData, child2& c2) : parent(myData), m_pChild2(&c2) {} 
}; 

class child2 : public parent { 
public: 
    child2(int myData) : parent(myData) {} 
}; 

inline 
int child1::GetSiblingData() { 
    return m_pChild2->GetData(); 
} 


int main() { 
    child2 c2(56); 
    child1 c1(42, c2); 
    std::cout << c1.GetSiblingData() << "\n"; 
} 

請注意幾件事情:

  • 一是class2向前聲明。這聲明瞭一個不完整的類型。不完整的類型可能用於指針和引用,但除非聲明瞭完整類型,否則這些指針可能不會被解引用。
  • 接下來,請注意,我沒有在child1類定義中包含child1::GetSiblingData()的函數體。這是因爲child2仍然是一個不完整的類型。正如你正確觀察到的那樣,編譯器還不知道什麼是child2的繼承。
  • 請注意,即使存在先前的child2前向聲明,也可能發生child2的定義。這個定義意味着child2不再是一個不完整的類型。
  • 最後,請注意child1::GetSiblingData的定義遵循child1child2的定義。在這個程序中,child2不再是不完整的,所以你可以提及它的成員。