使用动态绑定和纯虚类时,正确的语法是什么?

C++ What is the correct syntax when using dynamic binding and pure virtual class?

本文关键字:语法 是什么 动态绑定      更新时间:2023-10-16

当编译下面的c++代码时,我得到以下错误消息:

"抽象类类型'TrainerClass'的新表达式无效,因为函数'virtual void TrainerClass::AddItems()'在'TrainerClass'中是纯的"。

这段代码的目的是初始化一些"stuff"对象,这些对象相当于trainer的数量(int nbrtrainer = 2;)。在这个例子中,应该创建2个"stuff"对象:stuff[0]和stuff[1](指向'TrainerClass'类的指针)。然后,每个"stuff"对象内部的内容应该通过将"BagClass"类指向"stuff"对象来定义。

这里的困难在于'TrainerClass'类包含一个纯虚函数,这阻止了像往常一样初始化类对象。

使用动态绑定概念初始化从虚拟类派生的对象的正确语法是什么?(所有对象都应该命名为'stuff[x]',并带索引)

#include <iostream>
using namespace std;
#define Training  // to declare the global variable
///Definition of class Pocket
class pocket
{
  public:
      double volume;
};
///Definition of virtual class TrainerClass
class TrainerClass
{
  public:
    pocket *Space;
    virtual void AddItems()=0;
};
///Definition of derived class
class BagClass: public TrainerClass
{
  public:
      double mass;
      BagClass(double m2)
      {
        mass=m2;
      }
      void AddItems()
      {
         cout <<  "out virtual "  << endl;
      }
 };
#ifdef Training
#define Training
TrainerClass **stuff=0;
#else
extern TrainerClass **stuff;
#endif
int main()
{
    int nbrtrainer = 2;
    TrainerClass **stuff;
    for(int itrainer=0;itrainer<nbrtrainer;itrainer++) stuff[itrainer] = new TrainerClass;
    stuff[0] = new BagClass(0.2);
    stuff[1] = new BagClass(0.5);
    stuff[0]->AddItems();
    return 0;
}

您的TrainerClass有一个纯虚(=0)函数AddItems()。这将阻止您实例化该类的任何对象。不幸的是,您试图在for循环中这样做,这会导致错误。

注意,如果它会工作,这将是未定义的行为,因为你从来没有初始化指针stuff(你只分配stuff元素)。

这里有一个可以工作的变体,并且为了更方便使用#include <vector>:

...
vector<TrainerClass*> stuff(nbrtrainer);  // vector of the given dynamic size
//for(int itrainer=0;itrainer<nbrtrainer;itrainer++) 
//   stuff[itrainer] = new TrainerClass;  // you can't instantiate an abstract class 
stuff[0] = new BagClass(0.2);  // this is a valid instantiation
stuff[1] = new BagClass(0.5);
// 
...

这是在线演示。

这里有一个更动态的版本:

vector<TrainerClass*> stuff;  // empty vector
stuff.push_back(new BagClass(0.2));  // just add a new eleemnt at the end of the vector
stuff.push_back(new BagClass(0.5));
for (int i=0; i<stuff.size(); i++) 
   stuff[i]->AddItems();

下一个改进是使用智能指针而不是原始指针;-)