精华内容
下载资源
问答
  • 函数覆盖,虚函数,纯虚函数对比。c++ 源代码
  • 函数重载与函数覆盖的区别

    千次阅读 2019-03-18 09:40:51
    函数重载与函数覆盖的区别? (1)函数重载。 函数重载发生在同一个类的内部。这组函数具有相同的函数名,但是参数列表不相同,在函数调用过程中根据传入的实参类型,匹配最佳的函数并调用。 (2)函数覆盖发生在...

     

    函数重载与函数覆盖的区别?

    (1)函数重载。

    函数重载发生在同一个类的内部。这组函数具有相同的函数名,但是参数列表不相同,在函数调用过程中根据传入的实参类型,匹配最佳的函数并调用。

    (2)函数覆盖发生在子类与父类之间。父类中定义了一个虚函数,在子类中重新实现了这个函数,并且函数在子类和父类中具有相同的函数原型(函数名、参数列表),在调用函数过程中,根据对象的类型,调用相应类中的虚函数。

    总结一下:函数重载是同一类中的不同方法,函数覆盖是不同类中的同一方法;重载函数的参数列表不同,覆盖函数的参数列表相同;重载函数调用时根据参数类型选方法,覆盖函数调用时根据对象类型选择方法。

    注意一个问题:

    “名字隐藏”:指的是父类中有一组重载函数,子类在继承父类的时候如果覆盖了这组重载函数中的任意一个,则其余没有被覆盖的同名函数在子类是不可见的。例题如下:请写出下面程序的输出:

    class Base
    {
    public:
    	virtual void print(int a)
    	{
    		cout << "Base print int " << a << endl;
    	}
    
    	virtual void print(char a)
    	{
    		cout << "Base print char " << a << endl;
    	}
    
    	virtual void print(double a)
    	{
    		cout << "Base print double " << a << endl;
    	}
    };
    
    class Derived :public Base
    {
    public:
    	void print(int a)
    	{
    		cout << "Base print int " << a << endl;
    	}
    };
    
    int main()
    {
    	Derived d;
    	d.print(10);
    	d.print(5.88);
    	d.print('d');
    	system("pause");
    	return 0;
    }

    我们可能会认为函数重载会根据参数类型匹配最佳的函数,而函数覆盖会根据对象的类型调用相应类中的函数,因此参数类型为int时调用Derived类中的函数,参数为double和char类型时会调用Base类中的函数。但是事实却不是这样的,而是这样的:

    原因如下:

    Derived类只覆盖了Base类中一组重载函数的一个,因此参数类型为double何char的两个重载函数对于Derived类是不可见的,但是程序没有报错,原因是double类型和char类型都可以自动转换成int类型。就是所谓的“名字隐藏”。解决这种名字隐藏的办法有两个:(1)在子类中不适用函数覆盖,而是给子类的方法选择一个不同的函数名,区别于父类的方法。(2)子类覆盖父类中所有的重载方法,虽然这些重载方法中在子类中和父类中的实现完全一致,但是与第一种解决办法相比这样做的好处是不添加新的函数名。

     

     

     

     
     
     
    展开全文
  • 函数重载与函数覆盖的区别(C++)

    千次阅读 2018-05-25 11:45:57
    函数重载overload,函数覆盖override 函数重载是同一类中的不同方法,函数覆盖是不同类中的同一方法; 重载函数的参数列表不同,覆盖函数的参数列表相同; 重载函数调用时根据参数类型选择方法,覆盖函数调用时...

    函数重载overload,函数覆盖override

    函数重载是同一类中的不同方法,函数覆盖是不同类中的同一方法;

    重载函数的参数列表不同,覆盖函数的参数列表相同;

    重载函数调用时根据参数类型选择方法,覆盖函数调用时根据对象类型选择方法。

    展开全文
  • C++-函数覆盖和隐藏

    2014-08-08 22:44:53
    C++-函数覆盖和隐藏

    一:覆盖

    1.定义:覆盖是基类和派生类中的,基类函数是虚函数,派生类中重写此函数,函数名参数都想同,这就会发生覆盖

    为什么叫覆盖?

    因为派生类继承基类的时候实际上是先拷贝了基类的所有非private的成员,当基类的函数是虚函数的时候,如果重写此函数,函数名和参数完全相同,此时派生类中的函数会将派生的基类中的此函数覆盖掉(注意;并不是覆盖了基类的函数,而是派生类继承的基类的函数),所以叫做覆盖

    正式因为覆盖才有了C++中的多态

    条件:

           基类函数必须是虚函数

    发生在基类与派生类中

    函数名称和参数完全相同


    二:隐藏

    1.函数名称相同,参数不同,叫隐藏

    2.函数名同,参数同,但是无virtual,也是隐藏

    展开全文
  • 函数重载、函数覆盖以及函数隐藏

    千次阅读 2010-03-23 17:19:00
    函数重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同... 函数覆盖:有的书也称为函数重写(override)是指子类重新定义基类虚函数的方法 构成函数覆盖的条件是: (1

    数重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或者两者都不相同),函数重载是发生在同一个类中。调用时,根据参数的不同进行调用。同时编译器在编译期间就确定了要调用的函数,或者说这是一种早期绑定。同时,函数重载与多态无关。

     

    函数覆盖:有的书也称为函数重写(override)是指子类重新定义基类虚函数的方法

      构成函数覆盖的条件是:

     (1)基类的函数必须是虚函数(使用virtual关键字进行声明)

     (2)发生覆盖的两个函数要分别位于派生类和基类中。

     (3)函数名称与参数列表完全相同。

    由于C++多态性是通过虚函数来实现的,所以函数覆盖总是和多态联系在一起的。并且是程序运行时才确定要调用的函数,这是动态绑定,或者称为后期绑定。

     

    函数隐藏:是指子类中具有和父类(基类)同名的函数,但并不考虑参数列表是否相同,从而在子类中隐藏了父类的同名函数。

         函数隐藏有以下情况:

     (1)子类函数和父类函数完全相同(函数名和参数列表完全相同),只是基类的函数没有使用virtual关键字,此时基类的函数将被隐藏。

      (2)子类函数与父类函数名相同,但是参数列表不同,在这种情况下,无论父类的函数是否声明为virtual,父类的函数都将被隐藏。

    举例如下:

    上述程序就是一种典型的函数覆盖。

    运行结果是:

    fish bubble

     

    当我们把父类的breathe函数前的virtual去掉,再次运行程序,发现结果为:fish bubble

    但是此时是函数隐藏。

    另外,当函数隐藏发生时,如果在子类的同名函数中想要调用基类的被隐藏函数,可以使用“基类名::函数名(参数)”的语法形式。

     现举例如下:

    展开全文
  • 覆盖类成员:通过new关键字修饰虚函数表示覆盖该虚函数。 一个虚函数覆盖后,任何父类变量都不能访问该虚函数的具体实现。 public virtual void IntroduceMyself(){…}//父类虚函数 public new void ...
  • 上一篇C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable中,我在最后分析了虚函数与虚函数表的内存布局,在下一篇详细剖析虚函数及虚函数表的过程中,我发现有关函数重载,函数覆盖,函数重写和函数协变的...
  • js函数覆盖

    千次阅读 2017-09-19 09:59:59
    js中只要函数名形同,后加载的函数覆盖先加载的函数,无参数有无或参数多少无关。
  • 我的场景:smooth函数被k-wave工具包的smooth函数覆盖了。 解决办法: 1、在帮助里搜索smooth 2、去matlab文件夹里面找到这个函数(看下图的文件夹位置,先找到toolbox),然后复制那个函数文件(.m)。 3、粘贴到...
  • 函数重载和覆盖(也叫重写)是PHP中的OOP(面向对象)特性。在函数重载中,多个函数可以具有相同的方法名但参数的数量或类型不同。但是在函数重写的情况下,多个函数将具有相同的方法名和参数数量。 函数重载: ...
  • C++中函数覆盖 隐藏 重载区别

    千次阅读 2013-05-30 10:29:52
    C++在继承这一节涉及到函数覆盖 隐藏 重载等,如何区别它们呢? 首先函数覆盖的条件:基类函数必须是虚函数  发生覆盖的两个函数要分别位于派生类和基类中  函数名称和参数列表完全相同 其次函数隐藏主要有以下两种...
  • 函数覆盖及其使用举例

    千次阅读 2016-07-22 20:22:22
    覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本。  覆盖的特征为在不同的范围中(分别位于派生类与基类)的函数函数名字...
  • 研究过虚函数表的人都知道c++的多态是来自于虚函数表的函数指针覆盖,那么子类的虚函数指针覆盖了虚函数表中相应位置的父类虚函数指针后,那是怎么调用父类的虚函数的呢?即有如下继承关系:class fa{ public: ...
  • C++/CLI的函数覆盖

    千次阅读 2007-03-07 12:52:00
    隐式覆盖指iso-c++的函数覆盖,不同的是必须在子类覆盖函数最后加上关键字override如:virtual void Speak() override...{} 隐藏覆盖表示子类与父类同名的函数不再覆盖相应父类函数,而是新建这个函数。...
  • 方法重载,指的是同名函数,用不同的参数,即可以实现两个函数功能 记住啊,兄弟们,一个类中不能同时存在两个一模一样的方法名,但是两个类中可以哈(存在相同的可以哈) php没有方法重载,为什么? 代码演示把,兄弟...
  • 函数重载(overload): 概念:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。 特点:与返回值类型无关,只看参数列表。 优点:方便阅读,优化设计。 注意:不能有两个...
  • ...如过是函数覆盖,调用成员函数时,直接调用对象指针所属类的成员函数,例子中为fruit 虚函数的情况下,调用成员函数时,调用的是指向对象的所属类的成员函数,例子中为apple

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 693,546
精华内容 277,418
关键字:

函数覆盖