标题可能不是很具描述性,但很难用简短的句子描述我想要的内容。
所以我有一个像这样的基类:
class IBase
{
public:
virtual void f(int) = 0;
virtual void f(float) = 0;
}
然后我创建了一个抽象类,它只为浮点数定义f:
class HelpBase: public IBase
{
public:
virtual void f(float arg) override
{
f(static_cast<int>(arg));
}
}
我的目标是提供一个抽象类HelpBase,然后由将实现f(int)的其他类继承;
在我的HelpBase中,我想使用f(int),它在运行时将由其中一个类提供,但我不知道如何调用它。
在上面的例子中,编译器(gcc)complians对于HelpBase来说“f(int)”是未知的。
我不能把它写成IHelpBase :: f()因为它会强制使用IHelpBase的纯虚拟成员(gcc也会抱怨)。如何使用在基类中声明但在某些继承类中实际定义的函数?
如果我使用两个不同的名称,例如f代表浮点数,g代表整数,则没有问题。然后我可以调用g(static_cast(arg));在我的HelpBase中,它按预期工作。
答案 0 :(得分:9)
我认为您错过了添加using
声明以解除基类的f
重载集:
#include <iostream>
class IBase
{
public:
virtual void f(int) = 0;
virtual void f(float) = 0;
};
class HelpBase: public IBase
{
public:
using IBase::f;
virtual void f(float arg) override
{
std::cout << 1 << std::endl;
f(static_cast<int>(arg));
std::cout << 3 << std::endl;
}
};
class X: public HelpBase
{
public:
using HelpBase::f;
virtual void f(int) override
{
std::cout << 2 << std::endl;
}
};
int main()
{
X x;
x.f(0.1f);
}