虚函数是成员函数吗(下列关于虚函数的说明中,正确的是( ))

本文目录
- 下列关于虚函数的说明中,正确的是( )
- 关于虚函数的描述错误的是
- 下面关于虚函数的描述中正确的是( )
- 什么是虚函数
- 虚函数的定义是什么
- 下列关于虚函数的描述中,正确的是( )
- c++中虚函数,成员函数,非常原函数和友元函数,他们之间关系是什么啊
- 什么是虚函数,C++虚函数讲解
下列关于虚函数的说明中,正确的是( )
【答案】:B
在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public。如果一个类包含了纯虚函数,称此类为抽象类。所以本题答案为B。
关于虚函数的描述错误的是
错误的是基类中说明了虚函数后,派生类中对应的函数也必须说明为虚数。
基类中说明的虚函数,在派生类中自然就是虚函数,对于纯虚函数必须在后面继承的派生类中给出具体的实现;静态成员函数不能进行动态联编,所以虚函数不能是静态的。
一、虚函数
虚函数,是指被virtual关键字修饰的成员函数。在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。
二、定义虚函数的限制
1、非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。
实际上,优秀的程序员常常把基类的析构函数定义为虚函数。因为,将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。
2、只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。
3、当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数(函数名相同、参数列表完全一致、返回值类型相关)自动成为虚函数。
4、如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。
下面关于虚函数的描述中正确的是( )
【答案】:D
D。【解析】本题考查虚函数的概念。虚函数是非静态的成员函数,它不能是友元函数,但可以在另一个类中被声明为友元函数。虚函数必须是类的成员函数,虚函数声明只能出现在类定义的函数原型声明中,而不能在成员函数的函数体实现的地方,一般要求基类中说明了虚函数后,派生类说明的虚函数应该与基类中虚函数的参数个数相等,对应参数的类型相同。如果不相同,则将派生类虚函数的参数类型强制转换为基类中虚函数的参数类型。
什么是虚函数
虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:
virtual
函数返回值类型
虚函数名(形参表)
{
函数体
}
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。
(
注:下行语义容易使人产生理解上的偏差,实际效果应为:
如存在:Base
-》
Derive1
-》
Derive2
及它们所拥有的虚函数func()
则在访问派生类Derive1的实例时,使用其基类Base及本身类型Derive1,或被静态转换的后续派生类Derive2的指针或引用,均可访问到Derive1所实现的func()。)
动态联编规定,只能通过指向基类的指针或基类对象的引用来调用虚函数,其格式:
指向基类的指针变量名-》虚函数名(实参表)
或
基类对象的引用名.
虚函数名(实参表)
虚函数是C++多态的一种表现
例如:子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virtual(虚函数)。
使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。
如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virtual
函数名=0
我们把这样的函数(方法)称为纯虚函数。
如果一个类包含了纯虚函数,称此类为抽象类
。
虚函数的实例
#include《iostream.h》
class
Cshape
{
public:
void
SetColor(
int
color)
{
m_nColor=color;}
void
virtual
Display(
void)
{
cout《《"Cshape"《《endl;
}
private:
int
m_nColor;
};
class
Crectangle:
public
Cshape
{
public:
void
virtual
Display(
void)
{
cout《《"Crectangle"《《endl;
}
};
class
Ctriangle:
public
Cshape
{
void
virtual
Display(
void)
{
cout《《"Ctriangle"《《endl;
}
};
class
Cellipse
:public
Cshape
{
public:
void
virtual
Display(void)
{
cout《《"Cellipse"《《endl;}
};
void
main()
{
Cshape
obShape;
Cellipse
obEllipse;
Ctriangle
obTriangle;
Crectangle
obRectangle;
Cshape
*
pShape=
{
&obShape,
&obEllipse,&obTriangle,
&
obRectangle
};
for(
int
I=
0;
I《
4;
I++)
pShape-》Display(
);
}
本程序运行结果:
Cshape
Cellipse
Ctriangle
Crectangle
条件
所以,从以上程序分析,实现动态联编需要三个条件:
1、
必须把动态联编的行为定义为类的虚函数。
2、
类之间存在子类型关系,一般表现为一个类从另一个类公有派生而来。
3、
必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。
虚函数的定义是什么
1、虚函数的概念
虚函数是以virtual关键字声明的基类函数。如果在基类中将某个函数指定为virtual,并且派生类中有另外一个该函数的定义,则编译器将知道我们不想静态连接该函数。我们真正需要的是基于调用该函数的对象种类,在程序的特定位置选择调用哪一个函数。
2、定义
语法:virtual 函数返回类型 函数名(参数表) {函数体}
虚函数必须是基类的非静态成员函数,其访问权限可以是private或protected或public,在基类的类定义中定义虚函数的一般形式:
class基类名{
.......
virtual 返回值类型 将要在派生类中重载的函数名(参数列表);
};
下列关于虚函数的描述中,正确的是( )
【答案】:C
C。【解析】在成员函数声明的前面加上virtual关键字即把该函数声明为虚函数。虚函数可以是另一个类的友元函数,但不是静态成员函数。在派生类中可以重新定义从基类继承下来的虚函数,在派生类中重新定义虚函数时,函数名、形参表和返回值类型必须保持不变。
c++中虚函数,成员函数,非常原函数和友元函数,他们之间关系是什么啊
虚函数就是只定义,未实现的函数,一个类中定义的函数,称该类的成员函数, 友员,就是为类中指定的朋友用的。没关系,关系就是出自同一个类。
什么是虚函数,C++虚函数讲解
虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行晚绑定,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。
多态指同一个方法根据其所属的不同对象可以有不同的行为。
下面来看一个例子:
程序运行输出结果: 8, 12
为什么Base 对象的大小是8个字节而不是4个字节,为什么Derived 对象的大小是12个字节而不是8个字节,多出来的4个字节做什么用呢?和多态的实现有什么关系?
每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,该类的任何对象中都放着虚函数表的指针。虚函数表中列出了该类的虚函数地址。多出来的4个字节就是用来放虚函数表的地址的。
每当创建一个包含虚函数的类或者从一个有虚函数的基类中派生一个类时,编译器就为这个类创建一个VTABLE,在这个表中,放置了在这个类中或它的基类中所有声明为virtual的虚函数的地址。然后编译器在这个类中放置VPTR指向相应的VTABLE。VPTR必须在构造函数中被初始化,在VPTR初始化之前,绝对不能调用虚函数。所有的基类对象或者从基类派生出的对象的VPTR都在各自对象的相同位置。所有的VTABLE有相同的顺序,不管何种类型的对象。
C++的函数调用与C一样,都是从右向左进栈的,其间,对象的首地址也即this指针的值被压入栈,正因为调用每个成员函数时this都必须作为参数压进栈,所以成员函数知道它工作在哪个特殊对象上。这样,我们总能看到,在成员函数调用之前压栈的次数等于参数个数加一(除了STatic成员函数,它没有this)。
纯虚函数 :
抽象类就是在类的声明前面加上virtual关键字,为了防止误用抽象类,可以在抽象类中定义纯虚函数,例如virtual void x()=0;
这样做,等于告诉编译器在VTABLE中为函数保留一个间隔,但在这个特定间隔不放地址,只要有一个纯虚函数,则VTABLE就是不完全的,包含纯虚函数的类称为纯抽象基类。
虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:
那么,在使用的时候,我们可以:
A * a = new B();
a-foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。
如下声明表示一个函数为纯虚函数:
class A
{
public:
virtual void foo()=0; // =0标志一个虚函数为纯虚函数
};
一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。

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






