同名虚成员函数的继承

发布于 2024-10-16 04:20:57 字数 467 浏览 8 评论 0原文

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

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()’
...

I suspect that the problem comes from that both virtual functions have the same name, but different parameter signature. What I would like to know is that this is a g++-specific error message, how it is implemented the vtable, or it is an error based on the C++ standard.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

作死小能手 2024-10-23 04:20:57

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

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

也使 Start 在 A 中公开。

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

Overloading function hides all other Start functions. To use them add using A::Start:

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

Also make Start public in A too.

Edit: Here you can find why derived class hides base class functions.

不即不离 2024-10-23 04:20:57

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

The overload for Start in C hides all of the overloaded Start versions from A. If you did not try to overload Start in A [i.e. Start0(), Start1(float)] you wouldnt see this problem.

不寐倦长更 2024-10-23 04:20:57

您寻求在 CObj 上调用 Start()。但没有这样的函数,因为唯一定义的函数是重载的 Start(float a) ,它接受一个 float 参数。

正如编译器所说。

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

希望这有帮助。

You seek to call Start() on a CObj. But there is no such function because the only function defined is the overloaded Start(float a) which takes in a float parameter.

Exactly as the compiler says.

If a Start() function is deflared in the C class, calling this function should be fine. It can be declared as virtual and ned not be defined/implemented.

Hope this helps.

暗藏城府 2024-10-23 04:20:57
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
{
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 ();
}
So尛奶瓶 2024-10-23 04:20:57

当您重载另一个类中的函数时,永远调用重载函数
如果你不这样称呼它。
例如

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

when you overload a function in another class, for ever call overloaded function
if else you call it.
for example

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.
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文