[英]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.