博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚函数、纯虚函数详解
阅读量:4684 次
发布时间:2019-06-09

本文共 1875 字,大约阅读时间需要 6 分钟。

纯虚函数的作用

     在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的去做。

1.首先:强调一个概念 
       定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
       定义一个函数为纯虚函数,才代表函数没有被实现。定义他是为了实现一个接口,起到一个规范的作用,规范继承这个。类的程序员必须实现这个函数。 
2.关于实例化一个类: 
有纯虚函数的类是不可能生成类对象的,如果没有纯虚函数则可以。比如: 
class CA 
public: 
    virtual void fun() = 0;  // 说明fun函数为纯虚函数 
    virtual void fun1(); 
}; 
class CB 
public: 
   virtual void fun(); 
   virtual void fun1(); 
}; 
// CA,CB类的实现 
... 
void main() 
    CA a;   // 不允许,因为类CA中有纯虚函数 
    CB b;   // 可以,因为类CB中没有纯虚函数 
    ... 
3.虚函数在多态中间的使用: 
   多态一般就是通过指向基类的指针来实现的。 
4.有一点你必须明白,就是用父类的指针在运行时刻来调用子类: 
例如,有个函数是这样的: 
void animal::fun1(animal *maybedog_maybehorse) 
     maybedog_maybehorse->born();
参数maybedog_maybehorse在编译时刻并不知道传进来的是dog类还是horse类,所以就把它设定为animal类,具体到运行时决定了才决定用那个函数。也就是说用父类指针通过虚函数来决定运行时刻到底是谁而指向谁的函数。
5.用虚函数 
#include <iostream.h> 
class animal 
public: 
     animal(); 
     ~animal(); 
     void fun1(animal *maybedog_maybehorse); 
     virtual void born(); 
}; 
void animal::fun1(animal *maybedog_maybehorse) 
     maybedog_maybehorse->born(); 
}
animal::animal() { } 
animal::~animal() { } 
void animal::born() 
     cout<< "animal"; 
///horse
class horse:public animal 
public: 
     horse(); 
     ~horse(); 
     virtual void born(); 
}; 
horse::horse() { } 
horse::~horse() { } 
void horse::born()
     cout<<"horse"; 
///main
void main() 
     animal a; 
     horse b; 
     a.fun1(&b); 
//output: horse
6.不用虚函数 
#include <iostream.h> 
class animal 
public: 
     animal(); 
     ~animal(); 
     void fun1(animal *maybedog_maybehorse); 
     void born(); 
}; 
void animal::fun1(animal *maybedog_maybehorse) 
     maybedog_maybehorse->born(); 
animal::animal() { }
animal::~animal() { } 
void animal::born() 
     cout<< "animal"; 
horse
class horse:public animal 
public: 
     horse(); 
     ~horse(); 
     void born(); 
}; 
horse::horse() { } 
horse::~horse() { } 
void horse::born()
     cout<<"horse"; 
main
void main() 
     animal a; 
     horse b; 
     a.fun1(&b); 
//output: animal

转载于:https://www.cnblogs.com/wangkangluo1/archive/2012/05/13/2497777.html

你可能感兴趣的文章
2018-2019-1 20165301 《信息安全系统设计基础》第五周学习总结
查看>>
EF多个表映射
查看>>
J2EE项目集成SAP的BO报表
查看>>
SpringBoot常用属性配置
查看>>
文件上传漏洞总结
查看>>
SQL中Where与Having的区别
查看>>
/etc/sysctl.conf 控制内核相关配置文件
查看>>
Linux autojump命令
查看>>
linux sdcv命令
查看>>
BZOJ4836: [Lydsy1704月赛]二元运算【分治FFT】【卡常(没卡过)】
查看>>
MPU6050开发 -- 数据分析(转)
查看>>
springmvc入门详解
查看>>
Struts2和springmvc的区别
查看>>
用户名、密码等15个常用的js正则表达式
查看>>
对比多层字典是否相同函数
查看>>
用最简单的例子理解适配器模式(Adapter Pattern)
查看>>
你在哪编程?你的程序原料是什么?
查看>>
ehcache 简介
查看>>
java uuid 例子
查看>>
linux zip 压缩密码
查看>>