C++中虚函数和动态绑定<上>

从一个程序入手,我们来看看虚函数:
 1 #include <iostream>
2 using namespace std;
3
4 class A
5 {
6 public:
7 int ii;
8 /* void set_value(int val){i = val;};
9 int get_value(){return i;}; */
10 int a(){cout << "A::a" <<endl;
11 return 0;}
12 virtual void b(){cout << "A::b" <<endl;}
13 protected:
14 private:
15 int i;
16 };
17
18 class B : public A
19 {
20 public:
21 int jj;
22 B(){}
23 B(int bi, int bj):j(bj),A(bi){};
24 int a(){cout << "B::a" <<endl;
25 return 0;}
26 void b(){cout << "B::b"<<endl;}
27 private:
28 int j;
29 };
30
31 int main()
32 {
33 A *ptrA, objA;
34 B *ptrB, objB;
35
36 ptrA = &objA;
37 ptrA->a();
38 ptrA->b();
39
40 ptrA = &objB;
41 ptrA->a();
42 ptrA->b();
43
44 /*****************
45 这样强制内型转换,可以编译成功,但一般不这样做,因为这会造成派生类B自己定义的数据
46 丢失,而不能访问,如进行 ptrB->jj将会出错。
47 ptrB =static_cast<B *>(&objA);
48 ptrB->a();
49 ptrB->b();
50 ****************/
51
52 return 0;
53 }

 从结果中可以看出,对于类的非虚成员函数a(),无论实际对象是什么,都执行基类类型所定义的函数(如果去掉代码中注释掉的部分,我们会发现输出是这样的,可以看出调用什么类型,跟指针类型相关,只是由于数据损失,一般不这样用。--个人理解).

 然而,对于类中的虚函数b(),首先说明下,对于派生类中于基类中虚函数具有相同名字和参数的函数不加virtual 关键字,自动声明为虚函数,对于虚函数的调用是在程序运行期动态绑定的,这也就是类中多态的基础吧(个人理解),同意我们也可以通过基类的引用来达到上面相同的效果。至于什么是动态绑定,还有什么是虚析构函数,时候不早了,明天再写。
 
author:good90
参考书籍:《C++ Primer》
posted @ 2012-02-26 00:17  good90  阅读(794)  评论(0编辑  收藏  举报