调用从抽象类派生的类的方法[C++]

And*_*old 2 c++ abstract-class

如果这是一个非常基本的问题,你将不得不原谅我; 我很长一段时间没有使用过C++,所以我忘记了它的工作原理.

无论如何,我有一个基类和一些像这样的派生类(超级简化,但要点是相同的):

class Base
{
public:
   Base () { }
   int SomeFunction (int x, int y); // abstract definition
};

class Derived1 : public Base
{
public:
   Derived1() : Base() { }
   int SomeFunction (int x, int y)
   {
      // actual implementation
      return 4;
   }
};

class Derived2 : public Base
{
public:
   Derived2() : Base() { }
   int SomeFunction (int x, int y)
   {
      // actual implementation
      return 7;
   }
};
Run Code Online (Sandbox Code Playgroud)

后来在main我有一个Base对象列表:

Base *baseobjects[10];
Run Code Online (Sandbox Code Playgroud)

后来我充满的情况下,该数组Derived1Derived2.这适用于baseobjects[i] = &newDerived1(其中newDerived1Derived1类的实例).那一切都很好.

我似乎无法弄清楚的是如何稍后迭代baseobjects数组并调用SomeFunction列表中的每个实例,而不明确知道我正在使用哪个派生类.我在C#中完成了这个并且它工作正常,但显然我的C++语法是关闭的:

int result = baseobjects[i]->SomeFunction(a, b);
Run Code Online (Sandbox Code Playgroud)

LNK2019当我尝试编译时,这给了我一个错误,显然是因为它正在查看Base实现的类而不是它.我假设我必须使用一些指针技巧来让它看看正确的派生方法,但我尝试过的任何东西都没有用.有什么建议?

ere*_*eOn 8

你的方法应该被宣布virtual.在你的情况下,可能是纯粹的 virtual.

class Base
{
public:
   Base () { }
   virtual int SomeFunction (int x, int y) = 0; // abstract definition
};
Run Code Online (Sandbox Code Playgroud)

请注意,虽然这不是绝对必需的,但您也可以声明virtual析构函数.如果您通过基类的指针删除派生实例,请执行此操作.

class Base
{
public:
   //Base () {} // This is not required, the default provided constructor is similar.
   virtual ~Base() {} // virtual destructor.
   virtual int SomeFunction (int x, int y) = 0; // abstract definition
};
Run Code Online (Sandbox Code Playgroud)

编辑:

另外,关于您发布的链接错误:

要么你忘记了= 0,要么你Base::SomeFunction()从某个地方打电话.

正如Thomas Edleson指出的那样,= 0并不意味着你的函数没有实现:它可以有一个,但它只需要派生类(重新)实现它不是抽象的.

如果您对此主题感兴趣,我建议您阅读这篇文章.