【问题标题】:overriding functions in c++c++中的重写函数
【发布时间】:2013-07-03 12:59:40
【问题描述】:
#include <iostream>

using namespace std;

class Base {
public:
virtual void some_func(int f1)
{
cout <<"Base is called: value is : " << f1 <<endl;
}
};

class Derived : public Base {
public:
virtual void some_func(float f1)
{
cout <<"Derived is called : value is : " << f1 <<endl;
}
};


int main()
{
int g =12;
float f1 = 23.5F;

Base *b2 = new Derived();
b2->some_func(g);
b2->some_func(f1);
return 0;

}

输出是:

Base is called: value is : 12
Base is called: value is : 23

为什么第二次调用b2-&gt;some_func(f1) 调用Base 类的函数,即使Derived 类中有一个带有float 作为参数的版本?

【问题讨论】:

  • 有一个新的 C++11 关键字override。把它放在Derived中的方法签名some_func的末尾,错误信息会有所帮助。
  • 永远不要忘记删除堆指针。

标签: c++ overriding member-hiding


【解决方案1】:
  1. 它实际上并没有被覆盖,因为它的参数没有相同的类型。
  2. 由于它没有被覆盖,指向Base 的指针只知道int 方法,因此它会执行缩小转换(应该有警告)并调用Base::some_func(int)

【讨论】:

  • 感谢您的回答。 “功能隐藏”会在这里出现吗?我记得函数隐藏是关于在派生类中具有相同的函数名,而与签名无关。我试着做 Derived d; d.some_func(g);它编译。
【解决方案2】:

你混淆了重载和覆盖, 对于覆盖,函数的签名必须保持不变。 请再次检查 c++ 文档.. 希望这会有所帮助

【讨论】:

  • +1:虽然你没有说清楚,但当我意识到它超载时我明白了。
  • 起初我认为这与他实例化他的类的方式有关(使用 b2)。因此,如果我理解正确(我在 c++ 中不是 rknowledgeable),他将覆盖类 Base 但重载函数 some_func ???如果这是正确的,我在网上找到了有关如何覆盖类(矩形->框...)的示例,但是我们如何覆盖函数
  • 您通过覆盖具有相同签名的类中的函数来覆盖一个类,如果您不覆盖派生类中的函数,则派生类将不会提供任何不同的行为,除非定义一个新类型。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2013-06-10
  • 2021-09-11
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多