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)
后来我充满的情况下,该数组Derived1和Derived2.这适用于baseobjects[i] = &newDerived1(其中newDerived1是Derived1类的实例).那一切都很好.
我似乎无法弄清楚的是如何稍后迭代baseobjects数组并调用SomeFunction列表中的每个实例,而不明确知道我正在使用哪个派生类.我在C#中完成了这个并且它工作正常,但显然我的C++语法是关闭的:
int result = baseobjects[i]->SomeFunction(a, b);
Run Code Online (Sandbox Code Playgroud)
LNK2019当我尝试编译时,这给了我一个错误,显然是因为它正在查看Base实现的类而不是它.我假设我必须使用一些指针技巧来让它看看正确的派生方法,但我尝试过的任何东西都没有用.有什么建议?
你的方法应该被宣布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并不意味着你的函数没有实现:它可以有一个,但它只需要派生类(重新)实现它不是抽象的.
如果您对此主题感兴趣,我建议您阅读这篇文章.
| 归档时间: |
|
| 查看次数: |
3229 次 |
| 最近记录: |