您的位置:首页 > 编程语言 > C语言/C++

C++语言特性?虚函数与纯虚函数的作用与区别?

2016-08-24 16:36 302 查看
一、C++语言的特性有哪些?

1、封装

封装就是将抽象得到的数据行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机地结合,形成类,其中的数据和函数都是类的组成部分,称为类的成员。

2、继承

继承是从先辈处得到的属性和行为特征。类的继承,是新的类从已有类那得到已有的特性。另一方面,从已有类产生新类的过程就是类的派生。

由原来的类产生新类是,新类便包含了原来类的特征,同时也可以加入自己所特有的新特性。原来的类称为基类或父类,产生的新类称为派生类或子类。

公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。

(1)公有继承(public)

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

(2) 私有继承(private)

私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。

(3)保护继承(protected)

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

3、多态

多态性的定义:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。有两种类型的多态性:

(1)编译时的多态性:
(2)运行时的多态性:

虚函数与纯虚函数的作用于区别:

1、什么是虚函数?作用是什么?

那些被virtual关键字修饰的成员函数,就是虚函数。虚函数是动态绑定的基础,虚函数必须是非静态的成员函数,虚函数是通过虚函数表来实现的。虚函数的作用是为了实现多态性

虚函数的声明语法如下:

virtual 函数类型 函数名(参数表)

{

函数体

}

class Animal
{
public:
virtual void sleep()
{
cout<<”animal sleep”<<endl;
}
virtual void eat()
{
cout<<”animal eat”<<endl;
}
};


2、什么是纯虚函数?作用是什么?

纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的内容,纯虚函数的声明格式如下:

class 类名

{

virtual 函数类型 函数名(参数表)=0;

}

class Animal
{
public:
virtual void sleep()=0;//纯虚函数,必须在派生类被定义;
virtual void eat()=0;//纯虚函数,必须在派生类被定义;
};
class Tiger:public Animal
{
public:
void sleep() {cout<<”Tiger sleep”<<endl;}
void eat() {cout<<”Tiger eat”<<endl;}
};

引入纯虚函数的原因:

(1)为了方便使用多态性;

(2)在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、狮子等子类,但动物本身生成对象明星不合常理。为解决这个问题,引入了纯虚函数的概念。如果基类中包含一个或多个纯虚函数,那么它就属于抽象基类。抽象基类不能够被实例化,它定义的纯虚函数相当于接口,能派生类的共同行为提取出来。

3、虚函数与纯虚函数的区别

虚函数和纯虚函数以下方面的区别:

(1)类中如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样编译器就可以使用后期绑定来达到多态了;纯虚函数只是一个接口,是这个函数的声明而已,它要留到子类中去实现。

(2)虚函数在子类里面也可以不重载;但纯虚函数必须在子类中去实现,这就像java的接口一样。通常把很多函数加上virtual,是一个很好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,因为很难预料到父类里面的这个函数不在子类里面不去修改它的实现。

(3)虚函数的类用于“实作继承”,也就是说继承接口的同时也继承了父类的实现。纯虚汗的类用于“介面继承”,即纯虚函数关注的是接口的统一性,实现由子类完成。

(4)带纯虚函数的类叫虚基类,这种类不能直接生成对象,而只是被继承,并重写其虚函数后,才能使用。这样类也叫抽象类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: