标签:c style class blog code java
以下内容摘自《http://blog.csdn.net/haoel/article/details/1948051/》
C++中的虚函数的作用主要是实现了多态的机制,这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。
1)虚函数按照其声明顺序放于表中。
2)父类的虚函数在子类的虚函数前面。
1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。
2)没有被覆盖的函数依旧。
下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系。注意:子类并没有覆盖父类的函数。
对于子类实例中的虚函数表,是下面这个样子:
我们可以看到:
1) 每个父类都有自己的虚表。
2) 子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)
这样做就是为了解决不同的父类类型的指针指向同一个子类实例,而能够调用到实际的函数。
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 }
标签:c style class blog code java
原文地址:http://www.cnblogs.com/aoun/p/3769007.html