• C++中的多态


    1.所谓多态是指:父类和子类具有同名函数fun(),当使用父类指针p指向父类对象时,调用p->fun()函数时,执行的是父类的fun()函数;当使用父类指针p指向子类对象时(类型兼容性原则允许这么做),调用p->fun()函数时,执行的还是父类的fun()函数。原因在于子类从父类那里继承了一个fun()函数,自己又定义了一个fun()函数,则实际上子类中有两个同名的fun()函数。而用父类指针指向子类对象,实际上指向的是子类对象中继承自父类的fun()函数。那么虽然父类指针p指向子类对象,调用p->fun()函数时,执行的实际上是继承自父类的fun()函数。     我们实际想要的功能是:当父类和子类中具有同名函数fun()时,如果父类指针指向父类对象,则执行父类的fun()函数;如果父类指针指向子类对象,则执行子类的fun()函数,这个功能就叫做多态。为了实现这个多态功能,我们需要在父类的fun()函数前面添加一个关键字virtual,子类中的fun()函数前面可以不加virtual关键字声明,但一般我们为了醒目,让阅读程序的人知道这里可以实现多态功能,子类的fun()函数前面也是加virtual关键字的,

    以下代码是实现多态的实例:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 class Parent
     5 {
     6 public:
     7     Parent(int _a):a(_a){}
     8     void print(){cout<<"打印Parent类 a:"<<a<<endl;}
     9 
    10 public:
    11     int a;
    12 };
    13 
    14 
    15 class Child:public Parent
    16 {
    17 public:
    18     Child(int _a,int _a_,int _b):Parent(_a),a(_a_),b(_b){}
    19     void print(){cout<<"打印Child类 b:"<<b<<endl;}
    20 
    21 public:
    22     int a;
    23     int b;
    24 };
    25 
    26 
    27 int main()
    28 {
    29     Child  c(20,30,40);
    30 
    31     Parent *base;
    32 
    33     base=&c;
    34     base->print();
    35 
    36     return 0;
    37 }

    第8行的print()函数前面没有加virtual关键字,所以上面的代码无法实现多态功能,代码的执行结果为:打印Parent类 a:20     可以看出,执行的是Child类中继承自Parent类的print()函数。

    如果我们在第8行print(0函数的前面加上virtual关键字,则代码的执行结果是:打印Child类 b:40     这就实现了多态的功能

    注意:基类的指针,无论如何只能指向基类的属性和方法,以及子类中和基类同名的方法(不包括子类中和基类同名的属性,因为属性没法声明成virtual的)。对于子类的属性,以及子类中和基类函数不同名的函数,基类指针都是无法调用的。

    2.C++中面向对象编程的三大概念:

    封装:突破了C中函数的概念,用类做函数参数的时候,可以同时使用对象的属性和方法;

    继承:实现了代码的复用,可以使用以前的人写的代码;

    多态:搭建了一个框架,定义好函数调用的接口,则后来人只要按照此框架写代码,函数的调用方法就不会改变,现在写的代码用同一种方法可以调用后来人写的代码,相当于使用未来...

    3.实现多态的3个条件(适用于所有面向对象编程):

    (1).要有继承;

    (2).要有虚函数重写;

    (3).用父类指针(或父类引用)指向子类对象

    
    

     4.虚析构函数:

    c++中有时希望通过指向父类的指针释放子类对象的内存空间,如果不将父类析构函数前面加virtual关键字,则只能释放子类中继承自父类的属性的内存空间;如果在父类的析构函数前面加上virtual关键字,则可以析构子类对象的所有内存空间,这就叫虚析构函数。

  • 相关阅读:
    Mysql Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode
    vs2012+ winform+.net4.0发布如何在xp上运行
    ubuntu下手动配置apache2.4.12
    mysql连接错误解决(ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol ref used (client option 'secure_auth' enabled))
    位运算取绝对值
    位运算两数交换
    java mysql prepareStatement模糊查询like使用注意
    idea14远程调试linux下的tomcat
    web视频播放插件:Video For Everybody
    cmd杀死进程
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/8391190.html
Copyright © 2020-2023  润新知