c++ - 调用派生自抽象类的类的方法 [C++]

标签 c++ abstract-class

如果这是一个非常基本的问题,您将不得不原谅我;我已经很长时间没有这么频繁地使用 C++ 了,所以我忘记了它的大部分工作原理。

无论如何,我有一个基类和几个像这样的派生类( super 简单,但要点是一样的):

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;
   }
};

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

Base *baseobjects[10];

稍后我用 Derived1Derived2 的实例填充该数组。这适用于 baseobjects[i] = &newDerived1(其中 newDerived1Derived1 类的一个实例)。没关系。

我似乎无法弄清楚的是如何稍后遍历 baseobjects 数组并在列表中的每个实例上调用 SomeFunction 而没有明确知道我正在使用哪个派生类。我在 C# 中完成了此操作并且工作正常,但显然我的 C++ 语法已关闭:

int result = baseobjects[i]->SomeFunction(a, b);

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

最佳答案

您的方法应该声明为virtual。在您的情况下,可能是 虚拟

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

请注意,虽然这不是绝对必需的,但您也可以声明一个 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
};

编辑:

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

要么您忘记了 = 0,要么您从某处调用了 Base::SomeFunction()

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

如果你对这个话题感兴趣,我建议你阅读this post .

关于c++ - 调用派生自抽象类的类的方法 [C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051983/

相关文章:

c++ - 如何 std::thread sleep

c++ - 如何创建支持 `<<` 操作的线程安全日志类?

c++ - if 语句中的几个别名 namespace

C++ 管理对象

c++ - 在 C++ 中将函数指针转换为整数

Swift - 父类中属性的默认值应该是什么?

c++ - 在 C++ 中将对象传递给抽象类型的构造函数

objective-c - 如果没有抽象类,为什么他们在文档中引用它们?

java - 您可以定义抽象类的子类而不定义父类(super class)中定义的任何抽象方法吗?为什么?

ruby - 如何在 Ruby 中创建 "class cluster"(带有具体子类实例的工厂类)?