
正文
c语言虚函数解释 c语言虚数怎么表示
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
C++中虚函数的作用是什么?它应该怎么用呢?
C++中虚函数的作用:
1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。
同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
C++中虚函数的用法:
比如你有个游戏,游戏里有个虚基类叫「怪物」,有纯虚函数 「攻击」。然后派生出了三个子类「狼」「蜘蛛」「蟒蛇」,都实现了自己不同的「攻击」函数,比如狼是咬人,蜘蛛是吐丝,蟒蛇把你缠起来。
然后出现好多怪物的时候就可以定义一个 虚基类指针数组,把各种怪物的指针给它,然后迭代循环的时候直接 monster[i]-attack() 攻击玩家就行了,大概见下图:
扩展资料:
使用虚函数的注意事项:
一、包含虚函数的类指针列表会增大。
二、虚析构函数
析构函数的作用是在对象撤销之前做必要的“清理现场”的工作。当派生类的对象从内存中撤销的时候,会先先调用派生类的析构函数然后再调用基类的析构函数。
当我们new一个临时对象时,若基类中包含析构函数,并且定义了一个指向该基类的指针变量。
三、构造函数不能声明为虚函数
构造函数不能声明为虚函数。如果声明为虚函数,编译器会自动报出。
四、不在析构或者构造过程中调用虚函数
在析构函数或者是构造函数中,我们绝对不能调用虚函数。即使,我们在构造函数或者析构函数中调用虚函数,也不会下降至派生类中调用函数。
相关问答
Q1: 在c++中虚函数和多态性是什么意思
多态是指使用相同c语言虚函数解释的函数名来访问函数不同的实现方法c语言虚函数解释,即“一种接口c语言虚函数解释,多种方法”,用相同的形式访问一组通用的运算,每个运算可能对应的行为不同。C++支持编译时多态和运行时多态,运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。运行时多态的基础是基类指针,基类指针可以指向任何派生类对象。
虚函数与基类指针在一起时会有奇妙的现象。
1.虚函数是为了实现多态而存在的
请看以下程序:
#include
using namespace std;
class F
{
public:
void novir()
{
cout "father novir"
}
virtual void vir()
{
cout "father vir"
}
};
class S : public F
{
public:
void novir()
{
cout "son novir"
}
void vir()
{
cout "son vir"
}
};
int main()
{
F f;
S s;
s.novir();// 子类起作用,输出为 son novir
s.vir();//子类起作用,输出为son vir
f.novir();//父类起作用(因为其本身在这里与子类没有关系),输出father novir
f.vir();// 父类起作用(因为其本身在这里与子类没有关系),输出father vir
F *ff;
ff = s;//将一个父类指针指向一个子类对象;子类指针不能指向父类对象
ff-novir();//父类起作用,显示father novir
ff-vir();//子类起作用,虚函数多态的用处,显示 son vir,具体参见下面解释
return 0;
}
输出:
[root@localhost root]# ./vir
son novir
son vir
father novir
father vir
father novir
son vir
例如:父类为 车,子类为汽车
子类指针不能指向父类对象(即将父类对象赋值给子类指针):
因为子类中有些信息父类没有,如果用指针访问的时候很可能访问到父类没有的一些属性及函数,会出错。父类的对象可以有很多,自行车,摩托车,轿车等,如果用一个父类的对象赋给子类汽车的指针,汽车有的属性,例如发动机,父类对象就没有,会产生错误。
父类指针可以指向子类对象(即将子类对象赋值给父类指针):
由于继承的关系,子类对象同样也是父类的对象,例如:汽车有轮子,汽车也属于车,父类车也有轮子,这种情况下,子类对象就成为了父类的一个对象,所以只能操作父类有的属性及函数。对于那些父类没有的属性,必须将父类指针强制转化为子类指针后才可使用。
虚函数的多态体现
c语言虚函数解释我们都知道,程序运行的过程要经过 预处理,编译,运行,链接等步骤。虚函数在程序运行的时候才被绑定,编译的时候不进行相关处理,只有运行的时候才对其进行相关操作。
所以在程序片:
=======================================================
F *ff;
ff = s;//将一个父类指针指向一个子类对象;子类指针不能指向父类对象
ff-novir();//父类起作用,显示father novir
ff-vir();//子类起作用,虚函数多态的用处,显示 son vir
=======================================================
程序在运行时决定调用虚函数的哪个定义,这个决定依赖于基类型指针所指向的对象的类型。通过点运算调用虚函数时,忽略了虚函数的多态性,**只有**使用***基类型指针访问虚函数***,运行时的多态性才得以体现。即C++根据指针指向对象的类型来决定调用虚函数的哪个定义,在这里,指针所指向的类型为子类对象,所以虚函数使用子类的函数。
Q2: C++中 什么是虚方法
就是加上virtual关键字的类成员函数,效果和纯虚函数有所差别:
1 定义了纯虚函数的类是抽象类,不能被实例化。而定义了虚函数的类可以。
2 定义了虚函数的基类指针调用虚函数时,如果指向派生类并且派生类覆盖定义了虚函数,那么会调用派生类的这个函数。否则调用基类的这个函数。
3 如果派生类覆盖定义了基类的函数(没有virtual),那么基类指针指向派生类的时候调用的依然是基类的函数。
class A
{
public:
virtual int show(){}
int func(){}
};
class B:public A
{
public:
int func(){}
int show(){}
};
int main(int argc, char const *argv[])
{
A * ptr = new B();
ptr-func();//调用基类的func
ptr-show();//调用派生类的show
return 0;
}
这里面扯到一个多态问题,你自己去百度看看比较好。
Q3: c++中什么是虚函数?空虚函数有什么作用?可以声明抽象类的对象吗?为什么?新人求助。。。
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。下面来看一段简单的代码 class A{ public: void print(){ cout”This is A”endl;} }; class B:public A{ public: void print(){ cout”This is B”endl;} }; int main(){ //为了在以后便于区分,我这段main()代码叫做main1 A a; B b; a.print(); b.print(); } 通过class A和class B的print()这个接口,可以看出这两个class因个体的差异而采用了不同的策略,输出的结果也是我们预料中的,分别是This is A和This is B。但这是否真正做到了多态性呢?No,多态还有个关键之处就是一切用指向基类的指针或引用来操作对象。那现在就把main()处的代码改一改。 int main(){ //main2 A a; B b; A* p1=a; A* p2=b; p1-print(); p2-print(); } 运行一下看看结果,哟呵,蓦然回首,结果却是两个This is A。问题来了,p2明明指向的是class B的对象但却是调用的class A的print()函数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数 class A{ public: virtual void print(){ cout”This is A”endl;} //现在成了虚函数了 }; class B:public A{ public: void print(){ cout”This is B”endl;} //这里需要在前面加上关键字virtual吗? }; 毫无疑问,class A的成员函数print()已经成了虚函数,那么class B的print()成了虚函数了吗?回答是Yes,我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数。所以,class B的print()也成了虚函数。那么对于在派生类的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了。 现在重新运行main2的代码,这样输出的结果就是This is A和This is B了。 现在来消化一下,我作个简单的总结,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。
Q4: 虚函数和虚基类的区别是什么啊?
虚函数 , 虚基类,它们都和virtual有关,这两个带有虚字的定义容易使人混淆,下面先从作用上来解释这两个定义的区别:
1.虚函数是用于多态中virtual修饰父类函数,确保父类指针调用子类对象时,运行子类函数的。
2、.虚基类是用来在多继承中,如果父类继承自同一个父类,就只实例化一个父类(说的有点绕,就是只实例化一个爷爷的意思。
具体区别登陆详询。
Q5: 在C++ 中虚拟函数怎么用的,实现什么功能
虚函数的作用就是接口类能够提供协议(即这个接口的功能是什么,比如都是进行绘画,相对来说比较抽象),而各个子类可以给出具体不同的实现(比如长方形绘画时可以画出长方形,而三角形则画出来的就是三角形)。调用虚函数的客户只需要知道虚函数的提供的协议,而不需要关心这个实现这个虚函数的到底是个什么类(因为都是从一个基类继承的)。
当然你可能会想,为什么不能用非虚函数做上面的事情,我们可以实现时指定一个类型,比如有一个成员用来标识形状的类型,而在实现时用这个类型来判定如何进行绘画,简而言之就是if else或者switch语句,如同下面的代码:
class shape {
int type;
public:
void draw() {
switch (type) {
case rectangle:
draw_rectangle();
break;
case circle:
draw_circle();
break;
}
};
这个问题在于,当你有一个很多shape时,这个switch case将难以管理,因为有时候代码中有些地方就是需要根据类型来做判断,但是此时你会倾向于使用switch case来实现这些代码。久而久之,一旦加个新类型时,就会很难维护,因为要改动很多地方,就容易出错(当然如果改动地方不多,问题不会很大)。
但是如果使用虚函数实现,那么各个子类管理自己的实现,而有需要依据类型来判断的地方,可以通过虚函数来实现,因为每个类可以定制这种行为,对于draw而言,可以
class rectangle : public shape {
public:
virtual void draw() {
// draw rectangle;
}
};
class circle : public shape {
public:
virtual void draw() {
// draw circle
}
};
这样当我们需要加新shape的时候,只需要添加一个新的子类,实现draw(或者其他依赖于类型的函数时),就不用到处去修改那些swtich case语句了,也不容易出错了。
敏捷开发一书中,提到的OCP(开放封闭原则),就可以用虚函数来做到。
关于c语言虚函数解释和c语言虚数怎么表示的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







