虚函数
虚函数是在基类中说明,并由派生类重新定义(重写)的成员函数。当使用指针或对基类的引用,来引用派生类对象时,可以为该对象调用虚拟函数,并执行该派生类的函数版本。
虚函数和多态
虚函数是一种特殊的函数,当调用该函数时,它将解析为存在于基类和派生类之间的函数的最终派生版本。这种能力被称为多态性()。如果派生函数具有与该函数的基本版本相同的签名(名称,参数类型以及是否为const),并且返回类型相同,则将其视为匹配项。这种功能称为覆盖。
要想使函数成为虚函数,只需将“ virtual”关键字放在函数说明之前。
在面向对象的编程中,虚函数或虚拟方法是可继承,且可重写的函数或方法,有助于进行动态调度。这个概念是面向对象编程(OOP)的(运行时)多态性部分的重要组成部分。简而言之,虚函数定义了要执行的目标函数,但是在编译时可能不知道该目标。
虚函数的概念解决了以下问题:
在面向对象的编程中,当派生类从基类继承时,可以通过基类类型的指针或引用而不是派生类类型来引用派生类的对象。如果存在派生类重写了基类方法,则可以根据指针或引用的说明类型,或“后期”将此类引用或指针实际调用的方法“较早”(由编译器)绑定。 (即,由该语言的运行时系统),根据所引用对象的实际类型而定。
虚函数在“运行时”被确定。如果所讨论的函数在基类中是“虚拟”的,则将根据引用对象的实际类型,来调用该函数的最终派生类的实现,而不考虑指针或引用的说明类型。如果不是’virtual’,则根据指针或引用的说明类型,选择调用的函数。
虚函数允许程序调用在编译代码时甚至不一定存在的方法。
在C ++中,通过在基类中将virtual关键字放在函数的说明之前来说明虚拟方法。该修饰符在派生类中由该方法的所有实现继承,这意味着它们可以继续彼此替代并被后期绑定。即使基类拥有的方法调用虚拟方法,它们也将调用派生方法。当一个类中的两个或多个方法具有相同的方法名称,但参数不同时,就会发生重载。覆盖表示具有相同方法名称和参数的两个方法。重载也称为功能匹配,而重载则称为动态功能映射。
1 #include <iostream>
2
3 using namespace std;
4 class Shape
5 {
6 public:
7 Shape(int a, int b)
8 {
9 a_axis = a;
10 b_axis = b;
11 }
12 virtual double get_Area() {
13 cout << "Ellipse area: " << 3.14 * a_axis * b_axis << endl;
14 return (3.14 * a_axis * b_axis);
15 };
16 protected:
17 int a_axis, b_axis;
18 };
19
20 class Ellipse : public Shape
21 {
22 public:
23 Ellipse(int a = 0, int b = 0)
24 : Shape(a, b)
25 {
26 }
27 };
28
29 class Circle : public Shape
30 {
31 public:
32 Circle(int r = 0)
33 : Shape(r, r)
34 {
35 }
36 double get_Area()
37 {
38 cout << "Circle area: " << 3.14 * a_axis * a_axis << endl;
39 return (3.14 * a_axis * a_axis);
40 }
41 };
42
43 double get_area(Shape &s)
44 {
45 return s.get_Area();
46 }
47
48 int main(void)
49 {
50 Circle circle(5); // making object of child class Circle
51 Ellipse ellipse(4