一般来说接触到虚函数的同学们都会有三个问题~

虚函数有什么作用?什么时候才用到虚函数?运用的时候该注意什么?

ooxx研究院将会就这个问题和大家一起讨论~

虚函数是一个成员函数,该成员函数在基类内部声明并且被派生类重新定义。
从本质上讲,虚函数实现了“一个接口,多种方法”的理念,而这种理念是多态性的基础!

虚函数的原理和函数重载几乎一样,如果考试中问到这类问题,你要第一时间回答虚函数是一种类型的多态!(同样的形式不同的实现)
至于用处很多啊,就比如你在写抽象父类的时候你可能会想到子类要有哪些共同的方法(函数),但这些函数的具体实现又不一样,这个时候就是用虚函数了!
我曾经写过一个模拟的银行系统,银行中肯定有customer啦,那么customer分成两种类型,private和business,那么现在我要写一个简单的接口函数就是GetType(),里面的代码含简单啦,就是单纯的return “…”,那么问题来了我private类型的对象肯定return “Private”, 那business类型的对象是return “business”,这个时候就出现了同样的函数名称但是具体的代码确实不同的,这就是多态!(被继承的父类的同名函数的body或者说具体代码可以在它的子类中被重写)
e.g
//customer

virtual string GetType ( ) = 0;这里写成纯虚函数,就是完全没有函数body,因为我根本不知道到底有多少类型的customer~

//private customer

string CPrivateC::GetType ( )

{

return “private”;//The type must be “private” in this class.

}

//business customer

string CBusinessC :: GetType()

{

return “business”;//The type must be “business” in this class.

}

看到了吧,同样的名字不同的实现!多态!
另外你说什么时候用多态,你要知道在c++中如果你采用面向对象的编程方式,那么在c++里只要满足了封装,继承,多肽那么就是面向对象的标志!如果这三点有一个没达到,那根本就不是面向对象!
另外虚函数的“威力”只能体现在用父类类型的指针去访问子类的对象的时候,这个时候编译器会去根据你指针指向的对象的类型去选择该使用哪个函数!

Customer* Pcustomer = new Private_Customer;
pcustomer->GetType();//输出结果是private!
Customer* Pcustomer = new Business_Customer;
pcustomer->GetType();//输出结果是Business!
//可如果你不用父类指针的话那就完全没有意义了!
Private_Customer* p = new Private_Customer;
p->GetType();//此时编译器根本不用选择,因为你是子类的指针
所以多态的核心是父类指针能够根据生成的对象的类型去选择适合的函数!一定是父类指针!!!
跟函数重载的区别是一个是靠参数的类型和参数的个数,另一个是靠指针指向的对象的类型!

至于虚函数需要注意什么呢?

1.值不值得;凡是class中的成员函数都可以被写成虚函数,那么你这个函数到底已没有必要成为虚函数?如果每一个子类都有要使用它并且属于同样的形式不同的实现这个范畴(就像我上面非常简单的接口函数GetType),那就有必要了。也就是说你不能为了满足面向对象的准则而去多态(写虚函数),而是真的去要它!

2.写法; 写法肯定是知道的: virtual fun (); 但要清楚,你在父类中定义的虚函数,当子类继承过来的时候他还是虚函数!如下:

class father
{
public:
virtual fun () {//code};//在父类中定义虚函数
};
class child : public father
{
/*virtual*/fun () { //code };/*这个时候子类中它还是虚函数!无论你在前面写不写关键字
virtual 它都是虚函数*/
};

ooxx研究院建议你还是写上它是虚函数也就是+上关键字vitual,增加代码可读性!

3. 关于纯虚函数;纯虚函数就是这个函数根本就没有具体代码
(定义方式:virtual fun () = 0),
我仅仅是知道我将来要用到这个函数,但目前在父类中我用不到,仅仅是为了继承才写到父类中的,这个描述可能让人郁闷,但你可以这么想:父类根本涉及不到这个问题,而它所有的子类都涉及到这个问题,并且解决办法不同。。。那么最关键的就是最后要说的!抽象类!!!什么是抽象类?应该都知道,简单的说就是我的父类根本不会用来实例化对象!仅仅是为了继承而写它!
关键的是如果一个类中出现了纯虚函数形如virtual fun () = 0;那么这个类一定是抽象类,它不会用来实例化对象!但要搞清楚,纯虚函数仅仅是抽象类的一个标志!有纯虚函数一定是抽象类,但抽象类不一定有纯虚函数!
一定要记住,只要一个类中出现的船虚函数

评论被关闭。