繁体   English   中英

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

[英]Inheritance of virtual member functions with the same name

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

重载功能将隐藏所有其他Start功能。 要使用它们,请using A::Start添加:

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

也可以在A中将Start公开。

编辑: 在这里您可以找到为什么派生类隐藏基类函数的原因。

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

您试图在CObj上调用Start() 但是没有这样的函数,因为定义的唯一函数是带有float参数的重载Start(float a)

就像编译器所说的一样。

如果在C类中定义了Start()函数,则可以很好地调用此函数。 可以将其声明为虚拟的,并且可以定义/实现。

希望这可以帮助。

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 ();
}

当您在另一个类中重载函数时,如果没有调用,则永远调用重载函数。 例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM