• 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》
  • 相关阅读:
    初学Django
    Git的初始化配置和基本命令的使用
    python读取和写入excel里面的数据(附int变float解决方法)
    启动Django报错ModuleNotFoundError: No module named 'pytz'
    pytest之参数化
    解决pytest运行时报错ModuleNotFoundError
    专业程序员必知的技巧:敲打代码
    开源项目文档应规避的13处“硬伤”
    [置顶] 理解Linux系统负荷
    六大开源监测工具 你用过哪个?
  • 原文地址:https://www.cnblogs.com/good90/p/2368284.html
Copyright © 2020-2023  润新知