用代码理解C++中的多态、重载和虚函数

给代码俱乐部的同学写了一部分简单的C++教程,顺便发上来分享出来。


#include <iostream>
#include <string>
using namespace std;
/*
多态,重载与虚函数
 多态实际上是相同的类在处于不同身份时的不同表现。
重载、虚函数等等概念与其息息相关。
虚函数是指在方法前加入virtual关键字以消除类的多态性质。↑这些东西第一遍看不要求完全理解,看完示例后回头再看一遍定义会有更深的理解。
*/

class People{
public:
string Something_Common();     //使用平常的函数
virtual string Something_Virtual();  //使用虚函数
};
class Engineer : public People{
public:
string Something_Common();    //覆盖原函数。
string Something_Virtual();    //重载原函数。
};
/*
一般我们把复写父类中的普通函数称为覆盖,如复写虚函数称为重载。
附加内容 – 其它强类型(C系)语言中面向对象对比:
在C#中,为了增加代码可读性,覆盖/隐藏原方法需要添加关键词new;     *方法、子程序和函数是同一概念
出于同样的目的,在Java和C#中,重载方法
在C++与C#中,未指定是否为virtual的函数默认为非虚函数;然而在Java中,默认为virtual。是不是感觉一脸懵逼,而且不造有什么卵用??(╯‵□′)╯︵┻━┻
嘛….上面咱只说了语法的基本写法和定义,同学们感到懵逼是很正常的,下面咱给出一个示例。

在示例之前 ,我们先定义四个方法;
*/
string People::Something_Common(){
return “人类”;
}
string People::Something_Virtual(){
return “人类”;
}
string Engineer::Something_Common(){
return “工程师”;
}
string Engineer::Something_Virtual(){
return “工程师”;
}
main(){
//之后我们实例化一个Engineer类
Engineer *e = new Engineer();
//接着把同一个类传进父类People的指针中
People *p = (People *) e;//然后调用同一个类的同一个方法
cout<<“多态:”<<endl<<endl;
cout<<“\tp:【”<<p->Something_Common()<<“】。”<<endl;
cout<<“\te:【”<<e->Something_Common()<<“】。”<<endl<<endl;
//差不多了嗯。↑↑↑先运行一遍看看结果吧☆↑↑↑

cout<<“\t可以看到,虽然指针指向的是同一个类,但由于指针类型的不同,”<<endl
<<“\t父类的(People)指针调用的是父类的(People)中声明的方法;”<<endl
<<“\t而子类的(Engineer)指针调用的是子类的(Engineer)中声明的方法”<<endl
<<“\t这就是我们所说的类的多态。”<<endl<<endl
<<“【看到这里请退出继续看代码】”<<endl<<endl<<endl;

//但是有时候我们并不希望类表现出烦人的(划)多态性质。↓比如下面的情况。
//我们手中有一个People叫p,我们希望能获取他的职业。
cout<<“普通函数:”<<endl<<endl;
cout<<“\t普通方法:”<<endl;
cout<<“\t\t我的物种是【”<<p->Something_Common()<<“】。”<<endl<<endl;
//运行一遍试试。

cout<<“WTH?!物种是工程师是什么鬼。。(○′?д?)?”<<endl<<endl<<endl;

//这时候就需要虚方法sama救场了嗯↓
cout<<“\t虚方法:”<<endl;
cout<<“\t\t我的物种是【”<<p->Something_Virtual()<<“】。”<<endl;
//完美。

/*事实上,虚方法是向下查找的,如果查找失败,再调用原方法,
而普通方法并没有这个过程。请注意,虚方法有时可以暂时不实现,由子类实现。
由此延伸出了一种叫做模板模式的设计模式。*/

delete e;  //养成良好的垃圾回收编码习惯

}

Readers Comments (1)

  1. Wonderful blog! I foսnd it while browsing on Yahoo Ⲛews.
    Do yⲟu have any suggestions on how to get listed in Yahoo News?
    I’ve bеen trying for a while but I never seem to get there!
    Cheers

    回复

Leave a comment

Your email address will not be published.


*


不够聪明的人工智能可进不来哦 *