具有相同名称的虚拟成员函数的继承

时间:2011-02-03 20:10:15

标签: c++ function inheritance g++ virtual

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 ++标准的错误。

5 个答案:

答案 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.
}