如果这是一个非常基本的问题,您将不得不原谅我;我已经很长时间没有这么频繁地使用 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];
稍后我用 Derived1
和 Derived2
的实例填充该数组。这适用于 baseobjects[i] = &newDerived1
(其中 newDerived1
是 Derived1
类的一个实例)。没关系。
我似乎无法弄清楚的是如何稍后遍历 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/