没有合适的资源?快使用搜索试试~ 我知道了~
本文档详细介绍了C++中虚函数的原理以及在何场景下要用到虚函数。
资源详情
资源评论
资源推荐
C++中虚函数的作用(多态的原理)
2009-04-17 22:02
■ 如果你期望衍生类别重新定义一个成员函数,那么你应该在基础类别
中把此函数设为 virtual。
■ 以单一指令唤起不同函数,这种性质称为 Polymorphism,意思
是"the ability toassume many forms",也就是多态。
■ 虚拟函数是 C++ 语言的 Polymorphism 性质以及动态绑定的关键。
■ 既然抽象类别中的虚拟函数不打算被调用,我们就不应该定义它,应
该把它设为纯虚拟函数(在函数声明之后加上"=0" 即可)。
■ 我们可以说,拥有纯虚拟函数者为抽象类别(abstract Class),以
别于所谓的具象类别(concrete class)。
■ 抽象类别不能产生出对象实体,但是我们可以拥有指向抽象类别之指
针,以便于操作抽象类别的各个衍生类别。
■ 虚拟函数衍生下去仍为虚拟函数,而且可以省略 virtual 关键词。
虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次
上做文章.没了继承,什么都没得谈.
下面是对 C++的虚函数这玩意儿的理解.
一.什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那
你就应该从这里开始)
简单地说,那些被 virtual 关键字修饰的成员函数,就是虚函数.虚函
数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性
是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方
法,但因个体差异而采用不同的策略.下面来看一段简单的代码:
class A{
public:
void print(){ cout<<"This is A"<<endl;}
};
class B: public A{
public:
void print(){ cout<<"This is B"<<endl;}
};
int main() //为了在以后便于区分,我这段 main()代码叫做 main1
{
A a;
B b;
a.print();
b.print();
}
通过 class A 和 class B 的 print()这个接口,可以看出这两个 class
因个体的差异而采用了不同的策略,输出的结果也是我们预料中的,分
别是 This is A 和 This is B.但这是否真正做到了多态性呢? No,多态还
有个关键之处就是一切用指向基类的指针或引用来操作对象.那现在
就把 main()处的代码改一改.
int main() //main2
{
A a;
B b;
A* p1=&a;
A* p2=&b;
p1->print();
p2->print();
}
运行一下看看结果,哟呵,蓦然回首,结果却是两个 This is A.问题来
了,p2 明明指向的是 class B 的对象但却是调用的 class A 的 print()函
数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数.
class A{
public:
剩余11页未读,继续阅读
zhangyk1985
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0