将布尔指针定义为参数会引发错误 考虑两个C++类: class cTextbox : public cControl{ public: ... protected: void onUpdate(bool* keys); } class cControl{ public: ... protected: virtual void onUpdate(bool*) = 0; }

将布尔指针定义为参数会引发错误 考虑两个C++类: class cTextbox : public cControl{ public: ... protected: void onUpdate(bool* keys); } class cControl{ public: ... protected: virtual void onUpdate(bool*) = 0; },c++,function,class,virtual,C++,Function,Class,Virtual,这将返回一个错误C2504:“cControl”:在CPP文件中定义基类时,基类未定义。是否可能无法将指针作为参数传递给虚拟函数?这与虚拟函数或布尔参数无关 在定义cTextBox时,cControl还不存在,因此不能将其用作基础。这就是为什么错误消息说基类未定义:cControl,基类未定义 // base class first class cControl{ public: ... protected: virtual void onUpdate(bool*) = 0; }

这将返回一个错误C2504:“cControl”:在CPP文件中定义基类时,基类未定义。是否可能无法将指针作为参数传递给虚拟函数?

这与虚拟函数或布尔参数无关

在定义
cTextBox
时,
cControl
还不存在,因此不能将其用作基础。这就是为什么错误消息说基类未定义:
cControl
,基类未定义

// base class first
class cControl{
public:
    ...
protected:
    virtual void onUpdate(bool*) = 0;
}

// subclass second
class cTextbox : public cControl{
public:
    ...
protected:
    void onUpdate(bool* keys);
}

首先定义
cControl

始终在其子类之前定义基类,因为编译器需要知道基类的完整定义以进行继承。因此,如果在基类之前定义子类,C++将引发一个错误,说明基类是未定义的。
// base class first
class cControl{
public:
    ...
protected:
    virtual void onUpdate(bool*) = 0;
}

// subclass second
class cTextbox : public cControl{
public:
    ...
protected:
    void onUpdate(bool* keys);
}
也可以注意到C++中的构造顺序是:

  • 基本成员函数
  • 基本构造函数
  • 子类成员函数
  • 子类构造函数

  • cControl
    需要在
    cTextbox
    之前定义@1201programalam:答案需要在答案部分定义。谢谢,这真的让我忘了注意。你应该把它作为一个答案贴出来,这样我就可以标记它。@1201程序员:不,不是真的。子对象的构造顺序实际上并不影响它。没有从上到下执行C++。不过,它是(粗略地)从上到下解析的。谢谢你指出这一点。不过,这并没有改变编译器首先需要基类的完整定义,子类才能从基类继承的事实。知道子对象构造的顺序是很好的。