我知道这可能真的很愚蠢,但是如何做继承类的前向引用
喜欢
class parent
{
...stuff in here
}
class child1 : public parent
{
....
}
class child2 : public parent
{
....
}
所有的类都必须在同一个文件中,而我正在child1内使用child2的实例,反之亦然。我如何在这里进行正向引用?如果我只是说
class child2;
在代码的开头,当我在child1中使用编译器时,编译器无法识别出它是父级的子类(因此,虚函数不起作用)。请帮忙。
最佳答案
将所有建议加到一个可编译的示例中,我们可以:
#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::GetSiblingData()
类定义中包括child1
的函数体。这是因为child2
仍然是不完整的类型。正如您正确观察到的那样,编译器尚不知道child2
的继承是什么。 child2
前向声明,也可能会出现child2
的定义。此定义意味着child2
不再是不完整的类型。 child1::GetSiblingData
的定义遵循child1
和child2
的定义。至此,程序中的child2
不再是不完整的,因此您可以提及其成员。 关于c++ - C++正向引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5194843/