c++的virtual 多态性的原理?

如题所述

virtual 多态即指动多态
动多态是通过继承、虚函数(virtual)、指针来实现。
class A {
public:
virtual void func() const {
coust << “A::func()” << endl;
}
}

class B : public A {
public:
virtual void func() const {
coust << “B::func()” << endl;
}
}
使用:
A a* = B();
a->func();
输出:
B::func()
编译期是不调用任何函数的,编译器编译到a->func()时只是检查有没有语法问题,经过检查没有。编译器并不知道调用的是A版本的func()还是B版本的func(),由于a是一个指向B对象的指针,所以a只知道它指向的是一个A类型(或者能转换成A类型)的对象。通常集成体系就说明了(由于是公有继承)B是一种A。在运行期,a要调用a所指向对象的func()函数,就对它指向的对象下达调用func()的命令,结果a所指向的是一个B对象,这个对象就调用了自己版本(B版)的func()函数,所以输出时B::func()
与重载的区别:
(1) 重载的几个函数必须在同一个类中;
覆盖的函数必须在有继承关系的不同的类中
(2) 覆盖的几个函数必须函数名、参数、返回值都相同;
重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。
(3) 覆盖的函数前必须加关键字Virtual;
重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。

参考资料:http://www.360doc.com/content/12/0307/14/8484669_192465758.shtml
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-20
是这样的,对于virtual的函数,C++编译器会为每个这种函数在类的某个固定位置预留好一个函数指针大小的空间。
在对象构造的时候,填充这些函数指针
因为这些指针在父类和子类中位置都是固定的,所以在调用的时候
“我要调用的是第一个函数” “我要调用的是第二个函数”
就翻译成
“我要调用第一个位置上的函数指针” “我要调用第二个位置上的函数指针”
对于不同的对象,这些指针指向的代码不同
于是就算是同一个类型的指针,调用同一个函数,也可以做到执行不同的代码
原理就是指针指向的对象里,这些“函数指针”指向的代码不同本回答被提问者和网友采纳

c++的virtual 多态性的原理?
virtual 多态即指动多态 动多态是通过继承、虚函数(virtual)、指针来实现。class A { public:virtual void func() const { coust << “A::func()” << endl;} } class B : public A { public:virtual void func() const { coust << “B::func()” << endl;} } 使用:A a* = B...

高手替我解释C++中virtual,要详细,谢谢!
多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。多态性是允许将父对象设置成为和一个和多个它的子对象相等的技术,比如Parent:=Child;赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。举个例子...

为什么c++中virtual要翻译为虚函数?
在C++中,使用virtual关键字标识虚函数可以带来多种优势,包括多态性、代码复用以及灵活的类结构设计。通过理解virtual function在C++中的含义,可以更好地设计类和实现面向对象编程的高效解决方案。

C++中virtual关键字的用法
虚拟函数在C++中扮演着核心角色,特别是在面向对象编程的上下文中。当一个类包含有被`virtual`关键字标记的函数时,表示该函数是一个虚函数,其行为受到多态性的影响。多态性是允许函数在不同的对象类型上表现出不同行为的能力。1、虚函数的应用与区别于重载 在分析虚函数时,首先需要明确它与函数重载的...

在c++中虚函数和多态性是什么意思
这个决定依赖于基类型指针所指向的对象的类型。通过点运算调用虚函数时,忽略了虚函数的多态性,**只有**使用***基类型指针访问虚函数***,运行时的多态性才得以体现。即C++根据指针指向对象的类型来决定调用虚函数的哪个定义,在这里,指针所指向的类型为子类对象,所以虚函数使用子类的函数。

C++的virtual到底是怎么作用的,它在内部是怎么处理的?
virtual就是告诉编译器这是一个虚函数 编译器就会延迟绑定,在运行时从虚表里找到这个A*指针真正的对象是B类型,从而调用B的fun函数。你可以读一下《深入探索C++对象模型》,此书不读你就不是搞C++的!

C++基础-关键字virtual
virtual:虚函数说明符 virtual 说明符指定非静态成员函数为虚函数并支持动态调用派发。它只能在非静态成员函数的首个声明(即当它于类定义中声明时)的 声明说明符序列 中出现。解释:虚函数是可在派生类中覆盖其行为的成员函数。与非虚函数相反,即使没有关于该类实际类型的编译时信息,仍然保留被覆盖...

什么叫做多态性,在c++中是如何实现多态的
动多态则是通过继承、虚函数(virtual)、指针来实现。class A { public:virtual void func() const { coust << “A::func()” << endl;} } class B : public A { public:virtual void func() const { coust << “B::func()” << endl;} } 使用:A a* = B();a->func();...

c++问题 多态 virtual 和const
C++的动态多态是指对于一个成员函数的调用将根据对象的动态类型信息(多态机制的开销)执行不同的成员函数(这个函数是在基类中声明的虚函数并在派生类中可能被重写)。但是这里有两个前提:调用成员函数时必须通过基类的指针或者引用调用;被调用的成员函数必须是虚函数。对于一个非虚函数(普通成员函数)...

c++中的虚函数有什么作用?
其中多态性就是通过函数重载(运算符重载实质上也是函数重载)和虚函数来实现的。虚函数的作用:在基类用virtual声明成员函数为虚函数,在派生类中重新定义该函数,就可以通过基类指针或引用来访问基类和派生类中的同名函数。虚函数实现多态性:同一类族中不同类的对象,对同一函数调用做出不同的响应。多态...

相似回答
大家正在搜