请看这个简单的课程:
class TernaryPolynomial;
class IntegerPolynomial;
class DenseTernaryPolynomial:public IntegerPolynomial,public TernaryPolynomial
{
public:
DenseTernaryPolynomial();
static DenseTernaryPolynomial generateRandom(int,int,int);
};
你能解释一下我为什么编译器抱怨TernaryPolynomial必须是以前定义的类或结构?我认为它根本不应该关心,因为我提出了该类的前瞻声明。 这是TernaryPolynomial类
class Polynomial;
class IntegerPolynomial;
class TernaryPolynomial:public Polynomial
{
public:
TernaryPolynomial();
virtual ~TernaryPolynomial();
virtual IntegerPolynomial toIntegerPolynomial() = 0;
};
答案 0 :(得分:7)
对于派生,前向声明是不够的,您需要包含完整的类定义。
只有在将指针或对类的引用定义为成员或方法参数时,才能使用前向声明。一旦你真正开始使用东西(通过解除引用,通过引用访问成员或派生例子),你需要包括整个类定义。
答案 1 :(得分:2)
前向声明仅在声明指向类的指针时才有用。在这种情况下,不需要完整的类定义。
从类中派生会产生is-a
关系。除了存在之外,DenseTernaryPolynomial
不能是它不知道的东西。
sizeof
DenseTernaryPolynomial
必须在类定义的末尾以及所有成员(已继承或未继承)知道,但前向声明不提供此信息。
对于继承,您必须包含定义基类的标头。