虚函数与纯虚函数
来源:互联网 发布:linux 怎么进入vi 编辑:程序博客网 时间:2024/05/16 12:45
1、基本形式:
virtual
virtual ReturnType Function_2() = 0;
先讲示例吧,再总结结论。
2、示例:
class Animail{
public:
};
classDog: public Animail{
};
int main(int argc, char* argv[])
{
}
这段代码的输出结果是什么呢?起初我认为是:Animail::Function_1()与Dog::Function_1(),因为第一次输出是引用基类Animail的实例,第二次输出是引用子类Dog的实例。事实上答案是Animail::Function_1()与 Animail::Function_1(),为什么呢?
这里我们需要明白:你就记住,不管引用的实例是哪个类的,当你调用的时候,系统会调用左值那个对象所属类的方法。比如说上面的代码类Animail和 Dog都有一个Function_1函数,因为p是一个Animail类的指针,所以不管你将p指针指向类Animail或是类Dog,最终调用的函数都是类Animail的Function_1函数。这就是静态联篇,编译器在编译的时候就已经确定好了。可是如果我想实现跟据实例的不同来动态决定调用哪个函数呢?这就须要用到虚函数(也就是动态联篇)。
class Animail{
public:
};
class Dog: public Animail{
};
在基类的成员函数前加关键字virtual,则表示这个函数是一个虚函数。
所谓虚函数就是在编译的时候不确定要调用哪个函数,而是动态决定将要调用哪个函数。它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,编译器就可以使用后期绑定来达到多态了,也就是:用基类的指针来调用子类的这个函数。
要实现虚函数必须保证派生类的函数名与基类相同,参数名参数类型等也要与基类相同。但派生类中的virtual关键字可以省略,也表示这是一个虚函数。
下面来分析一下代码,声明一个基类的指针(必须是基类,反之则不行)p,把p指向类Animail的实例cAnimail,调用Function_1函数,这时系统会判断p所指向的实例的类型,如果是Animail类的实例就调用Animail类的Function_1函数,如果是Dog类的实例cDog就调用Dog类的Function_1函数。
下面来讲一下纯虚函数,包含纯虚函数的类也可叫虚基类或者抽象类:
class Animail{
public:
};
classDog : public Animail{
};
classPig : public Animail{
public:
};
如上代码,定义了一个动物类(Animail),类中有一函数GetColor可取得动物颜色,但动物有很多很多种,颜色自然无法确定,所以就把它声明为纯虚函数,也就是光声明函数名不去定义(实现)它,类Dog继承了Animail并实现了里面的代码,返回黄色。Bike类同样道理。有一点须要注意一下,纯虚函数不能实例化,但可以声明指针,所以上面的main函数中: Animail cAnimail; 编译器会告诉你:由于它的成员的原因,无法instantiate 抽象类Animail,并且警告你GetColor()
虚函数
纯虚函数
- 纯虚函数与虚基类
- 纯虚函数与纯虚类
- 虚函数与纯虚函数
- 虚函数与纯虚函数区别
- 虚函数与纯虚函数区别
- C++ 虚函数与纯虚函数
- 虚函数与纯虚函数
- 虚函数与多态性、纯虚函数
- 虚基类、虚函数与纯虚函数
- 虚函数与纯虚函数
- 虚函数与纯虚函数区别
- 虚函数与纯虚函数
- 虚函数与多态性 纯虚函数
- 虚函数与纯虚函数
- 虚函数与纯虚函数
- 虚函数与多态性/纯虚函数
- 虚函数与纯虚函数区别
- 虚函数与纯虚函数
- javascript string.Formart() 很棒!
- erlang开发环境配置-支持中文的ide Erlang如何安装和配置 附图详解
- 更改EBS R12中forms的模式Servlet/Socket
- 转载一个存储过程分页
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- 虚函数与纯虚函数
- erlang behaviour小结之gen_server OTP入门
- Poj 1111 Image Perimeters
- Http的KeepAlive
- 数据库 总结1
- Integer和int的区别
- public static byte[] stringArray2byteArray(String[] strs) {
- lpFindFileData
- zju1203最小生成树(克鲁斯卡尔算法)