zoukankan      html  css  js  c++  java
  • 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》
  • 相关阅读:
    13 内建属性 _getattribute_ 内建函数
    12 垃圾回收GC
    11 元类
    12 动态语言 __slots__
    11 作用域
    10 带参数的装饰器 通用装饰器 类装饰器
    9 装饰器
    8 闭包
    6 生成器 yield 协程
    cmd常用命令
  • 原文地址:https://www.cnblogs.com/good90/p/2368284.html
Copyright © 2011-2022 走看看