【问题标题】:Inheritance of virtual member functions with the same name同名虚成员函数的继承
【发布时间】:2011-06-20 22:33:37
【问题描述】:
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++标准的错误。

【问题讨论】:

  • 上面少了点东西;默认情况下,类例程都是私有的,因此您在上面编写的代码会发出与您发布的错误不同的错误...
  • 正如@fbrereto 指出的那样,您的方法的可见性仅限于 A 类,B 和 C 都不会继承它们。
  • 我认为作者只是快速拼凑了一些代码。它们当前位置的 ... 也会引发编译器错误
  • 我怀疑这是一个设计决定:假设第二个函数中的 float 参数是可选的 [即virtual void Start(float a = 3) {};] 那么定义就会不明确
  • A中的所有函数都是私有的,所以编译器找不到。

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


【解决方案1】:

重载函数会隐藏所有其他Start 函数。要使用它们,请添加 using A::Start:

class C : public A
{
public:
using A::Start;
virtual void Start(float a) {};
}

还要在 A 中公开 Start

编辑: Here 你可以找到派生类隐藏基类函数的原因。

【讨论】:

  • 但是这种设计背后的原因/原理是什么?谢谢,kecsap
【解决方案2】:

当你在另一个类中重载一个函数时,永远调用重载函数 如果否则你叫它。 例如

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

【讨论】:

    【解决方案3】:
    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】:

      您寻求通过CObj 致电Start()。但是没有这样的函数,因为唯一定义的函数是重载的Start(float a),它接受float 参数。

      正如编译器所说的那样。

      如果Start() 函数在C 类中被声明,调用这个函数应该没问题。它可以被声明为虚拟的并且不能被定义/实现。

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        C 中 Start 的重载隐藏了 A 中所有重载的 Start 版本。如果您没有尝试在 A 中重载 Start [即Start0(), Start1(float)] 你不会看到这个问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-22
          • 1970-01-01
          • 1970-01-01
          • 2017-01-05
          • 2014-04-16
          • 1970-01-01
          • 1970-01-01
          • 2013-02-11
          相关资源
          最近更新 更多