码迷,mamicode.com
首页 > 其他好文 > 详细

虚函数

时间:2014-06-05 14:32:26      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

以下内容摘自《http://blog.csdn.net/haoel/article/details/1948051/》

C++中的虚函数的作用主要是实现了多态的机制,这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。

 

1)虚函数按照其声明顺序放于表中。

2)父类的虚函数在子类的虚函数前面。

 

 

 

一般继承(有虚函数覆盖)

 

 

1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。

 

2)没有被覆盖的函数依旧。

 

 

下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系。注意:子类并没有覆盖父类的函数。

 

 bubuko.com,布布扣 

 

 

 

 

 

对于子类实例中的虚函数表,是下面这个样子:

 

 

 

 

 

 bubuko.com,布布扣

 

 

 

我们可以看到:

 

1)  每个父类都有自己的虚表。

 

2)  子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)

 

 

 

这样做就是为了解决不同的父类类型的指针指向同一个子类实例,而能够调用到实际的函数。

 

 

 

 

bubuko.com,布布扣
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Base {
 5 public:
 6     virtual void f() { cout << "Base::f" << endl; }
 7     virtual void g() { cout << "Base::g" << endl; }
 8     virtual void h() { cout << "Base::h" << endl; }
 9 
10 };
11 
12 class Derived : public Base {
13 public:
14 //    virtual void f1() {cout << "Derived::f1"<<endl; };
15     virtual void f() {cout << "Derived::f"<<endl; };
16     virtual void g1() {cout << "Derived::g1"<<endl; };
17     virtual void h1() {cout << "Derived::h1"<<endl; };
18 };
19 
20 typedef void(*Fun)(void);
21 
22 int main()
23 {    
24     Base b;
25     Fun pFun = NULL;
26 
27     cout << "虚函数表地址:" << (int*)(&b) << endl;
28     cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
29 
30     pFun = (Fun)*((int *)(*(int *)(&b)));
31     pFun();
32 
33     pFun = (Fun)*((int *)(*(int *)(&b))+1);
34     pFun();
35 
36     pFun = (Fun)*((int *)(*(int *)(&b))+2);
37     pFun();
38 
39     cout << "--------------------------\n";
40 
41     Derived d;
42 
43     pFun = (Fun)*((int *)*(int *)(&d));
44     pFun();
45 
46     pFun = (Fun)*(((int *)*(int *)(&d)) + 1);
47     pFun();
48 
49     pFun = (Fun)*(((int *)*(int *)(&d)) + 3);
50     pFun();
51 }
bubuko.com,布布扣

 

 

 

 

 

虚函数,布布扣,bubuko.com

虚函数

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/aoun/p/3769007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!