• C语言中的多态


    一、多态的主要特点

    1、继承体系下。继承:是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性 和行为,并能扩展新的能力,已有类被称为父类/基类,新增加的类被称作子类/派生类。 

    2、子类对父类的虚函数进行重写。

    3、虚表。

    在面向对象语言中,接口的多种不同现方式即为多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单说就是允许基类的指针指向子类的对象。 

    二、代码实现

    1、C++中的继承与多态

    复制代码
     1 class Base
     2 {
     3 public:
     4     virtual void fun() {} //基类函数声明为虚函数
     5     int B1;
     6 };
     7 class Derived :public Base //Derived类公有继承Base类
     8 {
     9 public:
    10     virtual void fun() { //函数重写,此时基类函数可以声明为虚函数,也可以不声明
    11         cout << "D1.fun" << endl;
    12     }
    13     int D1;
    14 };
    15 int main(){
    16     Base b1; //创建父类对象
    17     Derived d1;//创建子类对象
    18 
    19     Base *p1 = (Base *)&d1;//定义一个父类指针,并通过父类指针访问子类成员
    20     p1->fun();
    21 
    22     Derived *p2 = dynamic_cast<Derived*> (&b1); //dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引 用( 动态转换)
    23     p2->fun();  
    24 
    25     getchar();
    26     return 0;
    27 }
    复制代码

    2. C语言实现C++的继承与多态

    复制代码
     1 typedef void(*FUNC)(); //定义一个函数指针来实现对成员函数的继承
     2 struct _Base  //父类
     3 {
     4     FUNC _fun;//由于C语言中结构体不能包含函数,故借用函数指针在外面实现
     5     int _B1;
     6 };
     7 struct _Derived//子类
     8 {
     9     _Base _b1;//在子类中定义一个基类的对象即可实现对父类的继承
    10     int _D1;
    11 };
    12 void fb_()       //父类的同名函数
    13 {
    14     printf("_b1:_fun()
    ");
    15 }
    16 void fd_()       //子类的同名函数
    17 {
    18     printf("_d1:_fun()
    ");
    19 }
    20 int main() {
    21     _Base _b1;//定义一个父类对象_b1
    22     _Derived _d1;定义一个子类对象_d1
    23 
    24     _b1._fun = fb_;//父类的对象调用父类的同名函数
    25     _d1._b1._fun = fd_;//子类的对象调用子类的同名函数
    26 
    27     _Base *_p1 = &_b1;//定义一个父类指针指向父类的对象
    28     _p1-> _fun(); //调用父类的同名函数
    29 
    30     _p1 = (_Base *)&_d1;//让父类指针指向子类的对象,由于类型不匹配所以要进行强转
    31     _p1->_fun(); //调用子类的同名函数
    32 
    33     getchar();
    34     return 0;
    35 }
  • 相关阅读:
    <转>使用IdentifyTask查询图层属性
    转:Java+blazeds+Flex的例子 .
    转 ArcGIS Runtime 加载SHAPE数据的另一种方式动态图层 .
    序列密码之A5
    哈希函数之MD5
    DjangoRestFramework使用总结
    公钥密码之RSA
    Request Line is too large (xxxx > 4094) 问题处理
    古典密码之仿射密码
    Linux重定向
  • 原文地址:https://www.cnblogs.com/liangyc/p/11628196.html
Copyright © 2020-2023  润新知