2011-03-04 45 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不再是不完整的,所以你可以提及它的成员。