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 ++标准的错误。
答案 0 :(得分:5)
重载功能隐藏了所有其他Start
功能。要使用它们,请添加using A::Start
:
class C : public A
{
public:
using A::Start;
virtual void Start(float a) {};
}
也要在A中公开Start
。
编辑: Here您可以找到派生类隐藏基类功能的原因。
答案 1 :(得分:0)
C中Start的重载隐藏了A中所有重载的Start版本。如果你没有尝试重载A中的Start [即Start0(),Start1(float)]你不会看到这个问题。
答案 2 :(得分:0)
您试图通过Start()
致电CObj
。但是没有这样的函数,因为定义的唯一函数是重载的Start(float a)
,它接受float
参数。
正如编译器所说的那样。
如果在Start()
类中声明C
函数,则调用此函数应该没问题。它可以声明为虚拟,而不是定义/实现。
希望这有帮助。
答案 3 :(得分:0)
class A
{
public:
A() {}
virtual ~A() {}
virtual void Start() {}
virtual void Start(float a) {}
};
class B : public A
{
};
class C : public A
{
public:
using A::Start;
virtual void Start(float a) {}
};
int main ()
{
B BObj;
BObj.Start();
C CObj;
CObj.Start ();
}
答案 4 :(得分:0)
当你在另一个类中重载一个函数时,永远调用重载函数 如果你打电话的话。 例如
class A()
{
void start();
};
class B:public A
{
void start();
void Start();{A::start}//this function call it's father function
}
void main()
{
A a;
B b;
a.start();//call own function,start() in A.
b.start();//call is own function,start() in B.
b.Start();//call start() in A.
}