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(),无论实际对象是什么,都执行基类类型所定义的函数(如果去掉代码中注释掉的部分,我们会发现输出是这样的,可以看出调用什么类型,跟指针类型相关,只是由于数据损失,一般不这样用。--个人理解).
author:good90
参考书籍:《C++ Primer》