虚函数能构成重载吗?C++多态性 基类的虚函数和重载函数的区别,是不是一个是在运行时发生,一个是在编译时发生

本文目录
- 虚函数能构成重载吗
- C++多态性 基类的虚函数和重载函数的区别,是不是一个是在运行时发生,一个是在编译时发生
- 虚函数和重载函数有什么有分别
- 请问C++中类的虚函数能否进行重载
- C++中重载与重写函数区别及虚函数
- 6. 什么是虚函数虚函数与函数重载有哪些相同点和不同点
- 虚函数与重载函数的区别与联系
- 虚函数的定义
- 关于c++中虚函数重载的问题
虚函数能构成重载吗
虚函数的作用本身就是重载. 如果楼主指的重写, 在正常情况下"不能", 但有一个特例"可以":
class ParentClass { public : virtual void foo() {/*...*/}; };
class DerivedClass : public ParentClass { public : virtual void foo() {/*...*/};};
DerivedClass derived;
ParentClass parent = (ParentClass)derived;
ParentClass* pObj = &parent
pObj-》foo();
猜猜会执行哪个函数?
(不过想了想这个也不应该叫"重写, overwrite" 这个概念)
想详细了解虚函数可以参考一些相关文章和书籍, google一下就有了.
C++多态性 基类的虚函数和重载函数的区别,是不是一个是在运行时发生,一个是在编译时发生
基类的虚函数和重载函数
1)如果没有同名函数,没有定义派生类,虚函数就不是重载函数;
2)如果有同名函数就是重载函数
3)如果定义了派生类并且派生类重载了虚函数(纯虚函数必须重载,虚函数未必要重载)
则
基类的虚函数一定是重载函数
重载函数就是有其他函数和本函数同名。
虚函数则是, 基类的虚函数,很可能被重载,
用基类指针和引用调用虚函数时,如果该指针或引用实际指向或代表的对象是派生类的对象,并且该派生类重载了该虚函数,则调用的就是派生类重载了的虚函数,而不是基类的虚函数。这就是面向对象中的多态在C++中的实现方式了。
虚函数就是期待派生类重载的函数。
纯虚函数就是派生类必须重载的函数!
纯虚函数是虚函数的一种;
这就是虚函数和重载函数的关系了。
PS:再强调一下,重载只和函数名有关,参数只能说明可不可以重载;
基类和派生类的析构和构造函数似乎不算重载???,这个好像不明确。
类的不同构造函数也是重载。
1)如果基类没有定义任何派生类,则没有同名函数的虚函数就不是重载函数;
2)如果基类定义了派生类而且没有任何派生类重载了某个虚函数,则没有同名函数的基类的虚函数就依然不是重载函数;
3)如果有任何同名函数,则不论一个函数是否虚函数,该函数都是重载函数;
4)如果派生类和基类定义了任何同名函数,都是函数重载。
5)如果虚函数在派生类里面重新定义了,一定是重载;
6)有纯虚函数的类,有一个完全实现版本的派生类的话(可以定义对象),则一定是所有纯虚函数一定都会被重载。
7)基类和派生类的析构函数如果是虚函数则一定是重载函数(这是唯一的不同名函数的明确的函数重载)
虚函数和重载函数有什么有分别
函数重载是在同一个类中,相同名称不同形式参数的若干个函数,因此只要参数不同就可以调用这些同名称而不同内容的函数。虚函数是父类与子类中名称相同且参数相同的函数,因此在定义对象时,如果对象是是父类的对象执行的是父类的虚函数,如果对象是子类的对象执行的是子类虚函数。根据以上的说明,两者在概念和使用方式上当然是不同的。如果是涉及的是同个类中的对象,那就是的重载。如果两个类是父类与子类的关系,调用的函数是它们都有的,那么是虚函数调用。
请问C++中类的虚函数能否进行重载
举个例子,如果不能重载,一个虚函数只有一个函数名,那么就没有建立虚函数表的必要了。
class A
{
public:
virtual void show(int a){}//重载的时候,登记虚函数表是按地址登记的
virtual void show(int a, int b){}
};
class B:public A
{
public:
virtual void show(double a){}
virtual void show(double a, double b){}
};
int main(void)
{
return 0;
}
C++中重载与重写函数区别及虚函数
重载,多个方法使用同一个方法名,必须明确的可以识别应该调用哪个方法。
重写函数和虚函数很像,重新函数就是重新实现某个函数。
虚函数,虚函数分为两种,纯虚函数和虚函数。纯虚函数在集成时必须进行实现【重写覆盖】,而虚函数可以不用重写【如果重写了,则覆盖掉原函数】。
6. 什么是虚函数虚函数与函数重载有哪些相同点和不同点
函数重载是同一个函数名字,根据不同的参数,调用不同版本的同名函数.
虚函数它首先应该是属于一个类的.这个类还应该有父类或者子类,相关的类还有个指针形态的实例(没有这两点虚函数就没有意义了)。在创建这个指针的时候它属于哪个类,以后,哪怕这个指针被强制装换成了他的父类型或子类型,调用同名的虚函数,还是会使用当初创建时候对应的类的那个版本。
举个有点不恰当的例子说,‘父亲’和‘儿子’都会‘上班’这个行为,即使‘儿子’装扮成‘父亲’,他去‘上班’的时候还是去‘儿子’的公司上班。
虚函数与重载函数的区别与联系
虚函数在基类中声明 用virtual修饰 但是并不实现 ,只是在子类继承基类时才实现
重载函数是基类中已经有某个函数,当子类继承时重新实现(基类已实现)覆盖基类的方法。
这是一楼的两个定义,非常正确,书上是这样定义的
虚函数之所以存在,是因为要实现类对象的多态性,看看下面的一个程序段,你就知道虚函数有什么用了:
class A{
public:
virtual void f(){cout 《《 "A::f" 《《 endl;};
};
class B:public A{
public:
virtual void f(){cout 《《 "B::f" 《《 endl;};
};
class C:public A{
public:
virtual void f(){cout 《《 "C::f" 《《 endl;};
};
void test(A *a){
a-》f();
};
int main(int argc, char* argv)
{
B *b=new B;
C *c=new C;
char choice;
do{
cout《《"type B for class B,C for class C:"《《endl;
cin》》choice;
if(choice==’’b’’)
test(b);
else if(choice==’’c’’)
test(c);
}while(1);
cout《《endl《《endl;
return 0;
}
有了虚函数,那么很多种继承类的对象就可以通过一个基类“端口”(这里表现在void test(A *a){a-》f();};这个函数的实现),这样才能实现对象里的方法的实现是后面可能选择性的,你可以从反面想象一下,如果没有虚函数的话,这种选择性的对象实现会怎么来编写,当然会使代码变得非常的繁琐。
多态特性的工作依赖虚函数的定义,在需要解决多态问题的重载成员函数前,加上virtual关键字,那么该成员函数就变成了虚函数,从上例代码运行的结果看,系统成功的分辨出了对象的真实类型,成功的调用了各自的重载成员函数。
上面这句话你应该知道两者的关系了啊
多态特性让程序员省去了细节的考虑,提高了开发效率,使代码大大的简化,当然虚函数的定义也是有缺陷的,因为多态特性增加了一些数据存储和执行指令的开销,所以能不用多态最好不用。
虚函数的定义
1. 虚函数的定义
虚函数用来表现基类和派生类的成员函数之间的一种关系.
虚函数的定义在基类中进行,在需要定义为虚函数的成员函数的声明前冠以关键字 virtual.
基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义.
在派生类中重新定义时,其函数原型,包括返回类型,函数名,参数个数,参数类型及参数的先后顺序,都必须与基类中的原型完全相同.
虚函数是重载的一种表现形式,是一种动态的重载方式.
2. 为什么使用虚函数
#include
class CBase{
public:
void who( )
};
class CDerive1 : public CBase{
public:
void who( )
};
class CDerive2 : public CBase{
public:
void who( )
{cout《 who( );
p = &obj2
p -》 who( );
p = &obj3
p -》 who( );
obj2.who( );
obj3.who( );
return 1;
}
运行结果:
this is the base class!
this is the base class!
this is the base class!
this is the derive1 class!
this is the derive2 class!
通过对象指针进行的普通成员函数调用,仅仅与指针的类型有关,而与此刻正指向什么对象无关.要想实现当指针指向不同对象时执行不同的操作,就必须将基类相应中的成员函数定义为虚函数.
3. 虚函数与重载函数的关系
一般的重载函数,函数的返回类型及所带的参数必须至少有一样不完全相同,只需函数名相同即可.
基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型,函数名,参数个数,参数类型及参数的先后顺序,都必须与基类中的原型完全相同.
重载虚函数时,若与基类中的函数原型出现不同,系统将根据不同情况分别处理:
(1)仅仅返回类型不同,其余相同,系统会当作出错处理;
(2)函数原型不同,仅仅函数名相同,系统会认为是一般的函数重载,将丢失虚特性.
3.3.4 虚基类
#include
class x{
protected:
int a;
public:
void f ( ) ;
};
class x1 : public x {
public:
x1( );
class x2 : public x {
public:
x2( );
class y : public x1, public x2{
public:
y( );
main( )
{
y obj; //error
obj . f ( ) ; //error
return ;
}
二义性错误
非虚基类的类层次
虚基类的类层次
当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类.
class x1 : virtual public x
{
// … …
};
class x2 : virtual public x
{
// … …
};
虚基类的初始化
虚基类的初始化与一般多继承的初始化在语法上是一样的,但构造函数的调用次序不同.
派生类构造函数的调用次序有三个原则:
(1) 虚基类的构造函数在非虚基类之前调用;
(2) 若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用;
(3) 若虚基类由非虚基类派生而来,则仍先调用基类构造函数,再调用派生类的构造函数.
纯虚函数
仅仅用来为要从基类中派生的函数占据一个位置。
纯虚函数在基类中没有定义,它们被初始化为0。
任何用纯虚函数派生的类,都要自己提供该函数的具体实现。
定义纯虚函数
virtual void myMethod(void) = 0;
关于c++中虚函数重载的问题
大家都说错了,没说到重点。
这不是什么虚函数限制,主要原因在于函数调用名称解释的问题。按照名称解析规则,func在类derive中已经找到,所以后续的按参数匹配的名称查找会在该类中进行。
这也可以说是一个C++的值得商讨的地方吧,不过更多的,这可以做一个好的特性来使用,因为它避免了一些有争议的名称解析。
你可以这样指明调用关系:d.base::func(1);
derive类中的func关没有覆盖基类的虚函数。
思考如下的函数关系,你就会明白我说的争议的名称解析是什么意思了。如果名称查找继续发生在基类,后面的函数会引发二义性。
class base
{
public:
virtual void func(long a)
{
cout《《"reach base::func("《《a《《")"《《endl;
}
void func(double c)
{
cout《《"reach base::func("《《c《《")"《《endl;
}
};
class derive:public base
{
public:
virtual void func(long a)
{
cout《《"reach derive::func("《《a《《")"《《endl;
}
};
void main()
{
derive d;
d.func(1);
}

更多文章:
avantage怎么设置为中文(Avantage安装丢失GIT)
2026年10月15日 03:00
activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)
2026年10月14日 20:30
excel连接sql数据库教程(excel怎么连接sql数据库)
2026年10月14日 19:40






