同名虚成员函数的继承
class A
{
A() {};
virtual ~A() {};
virtual void Start() {};
virtual void Start(float a) {};
};
class B : public A
{ };
class C : public A
{
virtual void Start(float a) {};
}
...
B BObj;
BObj.Start(); // -> fine, no complain from g++
...
...
C CObj;
CObj.Start(); // -> not fine -> error: no matching function for call to ‘C::Start()’
...
我怀疑问题来自于两个虚拟函数具有相同的名称,但参数签名不同。我想知道的是,这是一个特定于g++的错误消息,它是如何实现vtable的,或者它是基于C++标准的错误。
class A
{
A() {};
virtual ~A() {};
virtual void Start() {};
virtual void Start(float a) {};
};
class B : public A
{ };
class C : public A
{
virtual void Start(float a) {};
}
...
B BObj;
BObj.Start(); // -> fine, no complain from g++
...
...
C CObj;
CObj.Start(); // -> not fine -> error: no matching function for call to ‘C::Start()’
...
I suspect that the problem comes from that both virtual functions have the same name, but different parameter signature. What I would like to know is that this is a g++-specific error message, how it is implemented the vtable, or it is an error based on the C++ standard.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
重载函数隐藏了所有其他 Start 函数。要使用它们,请添加
using A::Start
:也使
Start
在 A 中公开。编辑: 在这里您可以找到派生类隐藏基类函数的原因。
Overloading function hides all other
Start
functions. To use them addusing A::Start
:Also make
Start
public in A too.Edit: Here you can find why derived class hides base class functions.
C 中 Start 的重载隐藏了 A 中所有重载的 Start 版本。如果您没有尝试重载 A 中的 Start [即 Start0(), Start1(float)],您将不会看到此问题。
The overload for Start in C hides all of the overloaded Start versions from A. If you did not try to overload Start in A [i.e. Start0(), Start1(float)] you wouldnt see this problem.
您寻求在
CObj
上调用Start()
。但没有这样的函数,因为唯一定义的函数是重载的 Start(float a) ,它接受一个 float 参数。正如编译器所说。
如果在
C
类中声明了Start()
函数,则调用该函数应该没问题。它可以被声明为虚拟的并且不需要被定义/实现。希望这有帮助。
You seek to call
Start()
on aCObj
. But there is no such function because the only function defined is the overloadedStart(float a)
which takes in afloat
parameter.Exactly as the compiler says.
If a
Start()
function is deflared in theC
class, calling this function should be fine. It can be declared as virtual and ned not be defined/implemented.Hope this helps.
当您重载另一个类中的函数时,永远调用重载函数
如果你不这样称呼它。
例如
when you overload a function in another class, for ever call overloaded function
if else you call it.
for example