虚函数、纯虚函数详解
来源:互联网 发布:邮箱搜索软件 编辑:程序博客网 时间:2024/05/10 11:44
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();
定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。定义他是为了实现一个接口,起到一个规范的作用,规范继承这个。类的程序员必须实现这个函数。
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类,具体到运行时决定了才决定用那个函数。也就是说用父类指针通过虚函数来决定运行时刻到底是谁而指向谁的函数。
参数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
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()
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
cout<<"horse";
}
////////////////////main
void main()
{
animal a;
horse b;
a.fun1(&b);
}
//output: animal
你一定不要被 "虚函数 "这个词吓着,我一开始就被它吓着了,以为这又是个什么东东。
现在我就把我脑子里的虚函数聊聊,各位大见笑了:
在我们现实生活中有很多词,比如“开”这个词,现在有一辆汽车和一辆自行车在你面前,我对你说,“请把这个车开起来!”
当我指向汽车时,你就会加油门,然后转方向盘,汽车开起来。如果我指向自行车时,你就会两脚一登,把自行车开起来。你看,我对两种东西(汽车、自行车)用同一句话表达,而你会跟据我的指向去做不同的两件事(一个加油门,一个用两脚)。是不是很奇怪!!!!然后说一句,“你表什么表,我又不是小孩。” 因为我们有脑子,所以觉得这个很自然。
呵呵,但是计算机会像人一样去思考吗??不会,因为计算机很表(一会儿我会跟你说C++在这方面是怎么现实的,也就是它的对像模型)
我们写程序时,用函数来表达,用函数时就用函数名来调用,一个函数代表一个意思,对吧。但是现在我们想让一个函数表达两个意思,或是更多的意思,这个能行吗??能!!!这就是OO思想,面向对像,面向对像说白了就是一句话“万事万物,皆对像”(面向对象语言可以像人类一个去思考问题)C++、JAVA都是面向对像语言。
“虚函数”???能吗??当然我刚才说了,一般的函数不可能做到这一点,因为一个函数只有一个意思,现在“虚函数”就出来了,它可以完成这种状态,这就是“多态性”。“虚函数”就是会多态性而产生的。
现在我就把我脑子里的虚函数聊聊,各位大见笑了:
在我们现实生活中有很多词,比如“开”这个词,现在有一辆汽车和一辆自行车在你面前,我对你说,“请把这个车开起来!”
当我指向汽车时,你就会加油门,然后转方向盘,汽车开起来。如果我指向自行车时,你就会两脚一登,把自行车开起来。你看,我对两种东西(汽车、自行车)用同一句话表达,而你会跟据我的指向去做不同的两件事(一个加油门,一个用两脚)。是不是很奇怪!!!!然后说一句,“你表什么表,我又不是小孩。” 因为我们有脑子,所以觉得这个很自然。
呵呵,但是计算机会像人一样去思考吗??不会,因为计算机很表(一会儿我会跟你说C++在这方面是怎么现实的,也就是它的对像模型)
我们写程序时,用函数来表达,用函数时就用函数名来调用,一个函数代表一个意思,对吧。但是现在我们想让一个函数表达两个意思,或是更多的意思,这个能行吗??能!!!这就是OO思想,面向对像,面向对像说白了就是一句话“万事万物,皆对像”(面向对象语言可以像人类一个去思考问题)C++、JAVA都是面向对像语言。
“虚函数”???能吗??当然我刚才说了,一般的函数不可能做到这一点,因为一个函数只有一个意思,现在“虚函数”就出来了,它可以完成这种状态,这就是“多态性”。“虚函数”就是会多态性而产生的。
我不知道你懂了多少,我知道如果没有程序你无法了解。但是我忘记虚函数怎么拼写了。不好意思,
class 交通工具
{
虚函数 开(){}
}
class 汽车 public 交通工具
{ 开(){cout < < "加油门,然后转方向盘,汽车开起来 ";}
}
class 自行车 public 交通工具
{ 开(){cout < < "两脚一登,把自行车开起来 ";}
}
main()
{
汽车 aaa=new 汽车() ; //让我们来做个汽车
自行车 bbb=new 自行车() ;//让我们来做个自行车
交通工具 ccc;
ccc=aaa;
ccc.开();//注意
ccc=bbb;
ccc.开(); //注意
}
结果:
加油门,然后转方向盘,汽车开起来
两脚一登,把自行车开起来
你看,我们用一句话ccc.开()产生了两个结果。
class 交通工具
{
虚函数 开(){}
}
class 汽车 public 交通工具
{ 开(){cout < < "加油门,然后转方向盘,汽车开起来 ";}
}
class 自行车 public 交通工具
{ 开(){cout < < "两脚一登,把自行车开起来 ";}
}
main()
{
汽车 aaa=new 汽车() ; //让我们来做个汽车
自行车 bbb=new 自行车() ;//让我们来做个自行车
交通工具 ccc;
ccc=aaa;
ccc.开();//注意
ccc=bbb;
ccc.开(); //注意
}
结果:
加油门,然后转方向盘,汽车开起来
两脚一登,把自行车开起来
你看,我们用一句话ccc.开()产生了两个结果。
我现在就以为你是理解了吧,对不起我只能说到这个程序了,如果你在我身边我一定把你教会,但是在这里我无能了,我水平很低,也是学了不多时。
现在让我们来看看C++是怎么来实现这个的吧,为什么一个语句会做两种事。
嘿嘿,其实我们就是调用了两个函数而已(我知道你已经看到了是两个函数)可是你或许会问,那为什么在这里会用一句话做两种不同的事????
这里有几个条件:一,汽车和自行车必须是交通工具
class 汽车 public 交通工具
class 自行车 public 交通工具
只有这样我们能可以用“交通工具”去做不同的事。看看前面的话“把车开起来”(汽车是一种车,所以我说把车开起来,你就去把汽车开起来了)(自行车也是一种车,所以我说把车开起来时你就把自行车也开起来了)因为他们都是车。
现在让我们来看看C++是怎么来实现这个的吧,为什么一个语句会做两种事。
嘿嘿,其实我们就是调用了两个函数而已(我知道你已经看到了是两个函数)可是你或许会问,那为什么在这里会用一句话做两种不同的事????
这里有几个条件:一,汽车和自行车必须是交通工具
class 汽车 public 交通工具
class 自行车 public 交通工具
只有这样我们能可以用“交通工具”去做不同的事。看看前面的话“把车开起来”(汽车是一种车,所以我说把车开起来,你就去把汽车开起来了)(自行车也是一种车,所以我说把车开起来时你就把自行车也开起来了)因为他们都是车。
<<thinking in c++> > 中文<<C++编程思想>>
<<C++primer> > < <深入浅出MFC> >
这都是一级棒的书。
<<C++primer> > < <深入浅出MFC> >
这都是一级棒的书。
- C++纯虚函数详解
- C++纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- 虚函数、纯虚函数详解
- Mac mini+Parallels 8.0+FreeBSD-8.4-RELEASE-amd64-disc1 全纪录
- Leetcode: Longest Valid Parentheses
- iptables常用命令
- 新建个博客
- ubuntu下解压缩包命令
- 虚函数、纯虚函数详解
- Stacks of Flapjacks 翻煎饼-UVA120 白书第五章
- 庞果网-数组排序
- 线段树成段更新
- hdu3197 Game
- 图解CSS的padding,margin,border属性(详细介绍及举例说明)
- 如何将WinDBG中命令的输出保存到文本文件中
- JavaSwing图形界面编程之布局管理器(二)
- middle BZOJ2653