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

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

转自http://www.cppblog.com/ElliottZC/archive/2007/07/20/28417.html

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/mayingkun/archive/2013/03/27/2985090.html

你可能感兴趣的文章
C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】...
查看>>
关于git的认证方式
查看>>
字符串按照字典序排列
查看>>
IOS 开发调用打电话,发短信
查看>>
CI 框架中的日志处理 以及 404异常处理
查看>>
keepalived介绍
查看>>
css3 标签 background-size
查看>>
python itertools
查看>>
Linux内核调试技术——jprobe使用与实现
查看>>
样式、格式布局
查看>>
ubuntu设计文件权限
查看>>
Vue双向绑定原理详解
查看>>
Android基础总结(5)——数据存储,持久化技术
查看>>
关于DataSet事务处理以及SqlDataAdapter四种用法
查看>>
bootstrap
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
工程经验总结之吹水"管理大境界"
查看>>
为什么JS动态生成的input标签在后台有时候没法获取到
查看>>
20189210 移动开发平台第六周作业
查看>>
java之hibernate之基于外键的双向一对一关联映射
查看>>