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

时间:2016-11-12 00:14:20

标签: c++ class inheritance dynamic binding

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

"抽象类类型的新表达式无效' TrainerClass'因为函数'虚拟void TrainerClass :: AddItems()'纯粹属于' TrainerClass'"。

此代码的目的是初始化一些" stuff"等于训练者数量的对象(int nbrtrainer = 2;)。在这个例子中,2" stuff"应该创建对象:stuff [0]和stuff [1](指向' TrainerClass'类的指针)。然后,每个"内部的东西"对象应该通过指向' BagClass'来定义。上课"东西"对象。

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

使用动态绑定概念初始化从虚拟类派生的对象的正确语法是什么? (所有对象都应该被称为' 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;
}

1 个答案:

答案 0 :(得分:0)

您的TrainerClass有一个纯虚拟(= 0)函数AddItems()。这可以防止您实例化此类的任何对象。不幸的是,您尝试在for循环中执行此操作,这会导致错误。

注意如果它可以工作,它将是未定义的行为,因为你从未初始化指针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);
// 
...

这里是online demo

这是一个更加动态的版本:

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();

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