C++多态性。 基类的虚函数和重载函数的区别,是不是一个是在运行时发生,一个是在编译时发生?
3个回答
展开全部
基类的虚函数和重载函数
1)如果没有同名函数,没有定义派生类,虚函数就不是重载函数;
2)如果有同名函数就是重载函数
3)如果定义了派生类并且派生类重载了虚函数(纯虚函数必须重载,虚函数未必要重载)
则
基类的虚函数一定是重载函数
重载函数就是有其他函数和本函数同名。
虚函数则是, 基类的虚函数,很可能被重载,
用基类指针和引用调用虚函数时,如果该指针或引用实际指向或代表的对象是派生类的对象,并且该派生类重载了该虚函数,则调用的就是派生类重载了的虚函数,而不是基类的虚函数。这就是面向对象中的多态在C++中的实现方式了。
虚函数就是期待派生类重载的函数。
纯虚函数就是派生类必须重载的函数!
纯虚函数是虚函数的一种;
这就是虚函数和重载函数的关系了。
PS:再强调一下,重载只和函数名有关,参数只能说明可不可以重载;
基类和派生类的析构和构造函数似乎不算重载???,这个好像不明确。
类的不同构造函数也是重载。
1)如果基类没有定义任何派生类,则没有同名函数的虚函数就不是重载函数;
2)如果基类定义了派生类而且没有任何派生类重载了某个虚函数,则没有同名函数的基类的虚函数就依然不是重载函数;
3)如果有任何同名函数,则不论一个函数是否虚函数,该函数都是重载函数;
4)如果派生类和基类定义了任何同名函数,都是函数重载。
5)如果虚函数在派生类里面重新定义了,一定是重载;
6)有纯虚函数的类,有一个完全实现版本的派生类的话(可以定义对象),则一定是所有纯虚函数一定都会被重载。
7)基类和派生类的析构函数如果是虚函数则一定是重载函数(这是唯一的不同名函数的明确的函数重载)
1)如果没有同名函数,没有定义派生类,虚函数就不是重载函数;
2)如果有同名函数就是重载函数
3)如果定义了派生类并且派生类重载了虚函数(纯虚函数必须重载,虚函数未必要重载)
则
基类的虚函数一定是重载函数
重载函数就是有其他函数和本函数同名。
虚函数则是, 基类的虚函数,很可能被重载,
用基类指针和引用调用虚函数时,如果该指针或引用实际指向或代表的对象是派生类的对象,并且该派生类重载了该虚函数,则调用的就是派生类重载了的虚函数,而不是基类的虚函数。这就是面向对象中的多态在C++中的实现方式了。
虚函数就是期待派生类重载的函数。
纯虚函数就是派生类必须重载的函数!
纯虚函数是虚函数的一种;
这就是虚函数和重载函数的关系了。
PS:再强调一下,重载只和函数名有关,参数只能说明可不可以重载;
基类和派生类的析构和构造函数似乎不算重载???,这个好像不明确。
类的不同构造函数也是重载。
1)如果基类没有定义任何派生类,则没有同名函数的虚函数就不是重载函数;
2)如果基类定义了派生类而且没有任何派生类重载了某个虚函数,则没有同名函数的基类的虚函数就依然不是重载函数;
3)如果有任何同名函数,则不论一个函数是否虚函数,该函数都是重载函数;
4)如果派生类和基类定义了任何同名函数,都是函数重载。
5)如果虚函数在派生类里面重新定义了,一定是重载;
6)有纯虚函数的类,有一个完全实现版本的派生类的话(可以定义对象),则一定是所有纯虚函数一定都会被重载。
7)基类和派生类的析构函数如果是虚函数则一定是重载函数(这是唯一的不同名函数的明确的函数重载)
追问
。。。这个太长了,文不切题
追答
函数同名叫做函数重载,这个不长了吧;
1)除了析构函数,所有重名的函数,都是重载函数。
2)派生类和基类的虚析构函数(必须派生类重新定义了析构函数),虽然不同命名,也是重载函数。
3)被派生类重载了的基类的虚函数(重新定义了的)和派生类的同名函数是重载函数。
4)没有被派生类重载了的基类的虚函数(重新定义了的)不是重载函数( 重载函数必须有多于一个的定义)。
5)类外同名函数和类的同名方法是重载函数。
6) 派生类重载基类的虚函数,一般要求参数个数和类型以及定常性(是否常函数)必须相同 ,不然会被屏蔽,并有可能产生二义性(这点非常诡异哦!千万要注意了!)。
7)函数重载是 写了代码,就决定了的!!!,
和“编译”,“运行”一点关系也没有。
你是说没有说到这一点么!!!!!!!!!!!!
C++多态性,必须通过指针和引用实现。
虽然我们认为虚函数,是运行时决定的,实际上还是编译时就决定了的。
这通常叫运行时绑定,和编译时绑定。
指针本身的类型,和所指对象类型不同,但是由于继承体系的关系,虚函数会随着指针所指对象的类型变化调用不同类型定义的虚函数;
引用和指针也差不多,这个就是C++的多态。
C++的多态一定会使用重载函数来实现。就是一种特别的重载。
和一般的重载有些区别,和重载没有区别。因为这就是一种重载。
说穿了虚函数,就是
1)必须是在继承体系内部定义,不然和多态无关。
2) 同参数重载
3)除了返回值是基类的指针,派生类的返回值可以是派生类指针外,虚函数的返回值也必须和基类一致。
这样的虚函数就实现了面向对象的多态。
PS:
C++的多态是对指针和引用来说的!直接用变量是无所谓多态的!!
必须重载虚函数(不一定会重载,编译器只会要求,纯虚函数必须重载)才能够实现多态!!!
展开全部
是的,函数的重载是在编译的时候发生,而虚函数是在运行的时候确定。其实有时候称函数的重载为静态多态性,而虚函数为动态多态性
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
虚函数在基类中声明 用virtual修饰 但是并不实现 ,只是在子类继承基类时才实现
重载函数是基类中已经有某个函数,当子类继承时重新实现(基类已实现)覆盖基类的方法。
虚函数和重载在子类和基类中的方法同名,参数类型相同,返回值类型相同。个人感觉 虚函数是一种特殊的重载,即必须被重载的函数(一般函数可以不被重载)
重载函数是基类中已经有某个函数,当子类继承时重新实现(基类已实现)覆盖基类的方法。
虚函数和重载在子类和基类中的方法同名,参数类型相同,返回值类型相同。个人感觉 虚函数是一种特殊的重载,即必须被重载的函数(一般函数可以不被重载)
追问
原来虚函数一定要被重载。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询