【面向对象方法(VC++)】5虚函数与多态性
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
多态性的概念
• 多态性是指具有相似功能的不同函数使用同一 个名称来实现,从而可以使用相同的调用方式 来调用这些具有不同功能的同名函数的特性。 • C++的多态性是指对同一条消息,被不同类型的 对象接收将产生不同的行为。 • 多态性是实现“一种接口,多种方法”的技术。 这里的“一种接口”是指相同函数名,而“多 种方法”是指多种函数实现。
10
接上例
• class manager :public manager{ ... • public: • virtual whoami(){ …} • ..};
11
接上例
• void main() • {employee *emp[3]; • emp[0]=new employee; • emp[1]=new manager; • emp[2]=new director; • for(I=0;I<3;I++) • emp[i]->whoami(); 分别打印三种不同对象的 whoami()函数。而不只是基类对象。 •}
5
动态联编
• 只有在运行程序时才能确定将要调用的函数。这种在运行阶段进 行的联编称为动态联编。
• 动态联编的优点是提供了更好的编程灵活性、问题抽象性和程序 易维护性,缺点是与静态联编相比,函数调用速度慢。
6
虚函数
• 虚函数是动态联编的基础。 • 虚函数是非静态的成员函数,经过派生之后,虚函数在类族中
3
联编
• 多态性的实现过程中,确定调用哪个同名函数的过 程就是联编(binding),又称绑定。 • 联编是指计算机程序自身彼此关联的过程,也就是 把一个标识符名和一个存储地址联系在一起的过程。 • 用面向对象的术语讲,就是把一条消息和一个对象 的方法相结合的过程。 • 按照联编进行的阶段的不同,可以分为静态联编和 动态联编,这两种联编过程分别对应着多态性的两 种实现方式。
可以实现运行时的多态性。
7
虚函数的声明
• 虚函数是一个在某基类中声明为virtual并在一个或多个派生类中 被重新定义的成员函数。声明虚函数的格式如下:
virtual <返回值类型> <函数名>(<参数表>);
8
虚函数的使用
• 如果某类中的一个成员函数被说明为虚函数,这就意味着该成员函数在 派生类中可能有不同的函数实现。
• } 也表现了一个函数show()多种形态。
15
虚函数的语法总结说明
•1.虚函数的返回类型、名字、参数必 须完全系统。 •2.只有类的成员函数才能是虚函数。 这样才能与具体对象相联结,以实现 不同类对象的同一函数的“多态”。 •3.静态成员函数不能说明为虚函数。
16
接上页
• 4.虚函数不能是内联的。因为它实现了动态联编。假如在类内进 行了定义,也认为它是非内联的。
• 当使用对象指针或对象引用调用虚函数时,采用动态联编方式,即在运 行时进行关联或绑定。
9
例1
• class employee{ ... • public: • virtual whoami(){ …} • ..}; • class manager:public employee{ ... • public: • virtual whoami(){ …} • ..};
14
接上例
• void main(){
• A demo1,*p; • B demo2;
同一样的语句,有不同 的行为
• p=&demo1;
• p->show(); 显示“class A show() is called”
• p=&demo2;
• p->show(); 显示”class B show() is called”
第5章 虚函数与多态性
说明: 1.多态性是OOP的重要组成部分。 它是 C++中的难点之一。C++的多态性是靠虚 函数实现的。实际上虚函数使类的成员 函数表现出多种形态。 2.虚函数的形式十分简单,要领会其实 质则不简单。
1
本章主要内容
• 多态性的概念和多态类型 • 联编 • 虚函数 • 抽象类 • 运算符重载
4
静态联编
• 在编译阶段完成的联编称为静态联编。 • 在编译过程中,编译系统可以根据类型匹配等特 征来确定程序中调用操作与执行某个同名函数实 现之间的关系,即确定某一个同名函数到底是要 调用哪一段函数实现代码。 • 函数重载和运算符重载就是通过静态联编方式实 现的编译时的多态的体现。 • 静态联编的优点是函数调用速度快、效率较高, 缺点是编程不够灵活。
12
上述例子实现了一个 whoami() 函 数有三种行为,即多态 。
•这是关于多态性的语法方面的分析 理解。 •为了进一步形象地理解多态,见下 例:
13
例2
• class A{public:virtual void show() • {cout<<“class A show() is called”<<endl;} • }; • class B:public A • {public: void show() • {cout<<“class B show() is called”<<endl;} • };
• 5.构造函数不能是虚函数。 • 6.析构函数可以为虚函数,此时虚析构函数的名字为“~类型
名”。以实现其“多态”地撤消不同类对象。
17
接上页
• 7.虚函数的“虚拟性”可以“继承”。即基类写了关键字 virtual 后,派生类的同名、同参数、同类型函数也是虚函数,可以不写 virtual 。多层继承时,如中间类不写虚函数,其后的派生类需要 时重新定义即可。即不会出现虚拟继承的传递路径中断。
• 8.注意虚函数与虚基类的区别。
18
接上页
• 9.虚函数实现多态,只能通过指针或引用进行。因为只有这样, 才能实现动态联编。
• 10.多态可简单地理解为:同一名字多种含义。如:
BASKETBALL
Leabharlann Baidu
PLAY
FOOTBALL
PINGPONGBALL
19
再接上页
• 11.派生类内可以调用基类的虚函数。但为了保 持不破坏多态,一般不提倡这样做。 • 12.虚函数的存取决定于首次定义它的基类中该 函数是公有还是私有。如果是公有,派生类中仍 然是公有;如果是私有,派生类中仍然是私有。 • 13.注意虚函数与重载函数的区别。见下页
多态性的概念
• 多态性是指具有相似功能的不同函数使用同一 个名称来实现,从而可以使用相同的调用方式 来调用这些具有不同功能的同名函数的特性。 • C++的多态性是指对同一条消息,被不同类型的 对象接收将产生不同的行为。 • 多态性是实现“一种接口,多种方法”的技术。 这里的“一种接口”是指相同函数名,而“多 种方法”是指多种函数实现。
10
接上例
• class manager :public manager{ ... • public: • virtual whoami(){ …} • ..};
11
接上例
• void main() • {employee *emp[3]; • emp[0]=new employee; • emp[1]=new manager; • emp[2]=new director; • for(I=0;I<3;I++) • emp[i]->whoami(); 分别打印三种不同对象的 whoami()函数。而不只是基类对象。 •}
5
动态联编
• 只有在运行程序时才能确定将要调用的函数。这种在运行阶段进 行的联编称为动态联编。
• 动态联编的优点是提供了更好的编程灵活性、问题抽象性和程序 易维护性,缺点是与静态联编相比,函数调用速度慢。
6
虚函数
• 虚函数是动态联编的基础。 • 虚函数是非静态的成员函数,经过派生之后,虚函数在类族中
3
联编
• 多态性的实现过程中,确定调用哪个同名函数的过 程就是联编(binding),又称绑定。 • 联编是指计算机程序自身彼此关联的过程,也就是 把一个标识符名和一个存储地址联系在一起的过程。 • 用面向对象的术语讲,就是把一条消息和一个对象 的方法相结合的过程。 • 按照联编进行的阶段的不同,可以分为静态联编和 动态联编,这两种联编过程分别对应着多态性的两 种实现方式。
可以实现运行时的多态性。
7
虚函数的声明
• 虚函数是一个在某基类中声明为virtual并在一个或多个派生类中 被重新定义的成员函数。声明虚函数的格式如下:
virtual <返回值类型> <函数名>(<参数表>);
8
虚函数的使用
• 如果某类中的一个成员函数被说明为虚函数,这就意味着该成员函数在 派生类中可能有不同的函数实现。
• } 也表现了一个函数show()多种形态。
15
虚函数的语法总结说明
•1.虚函数的返回类型、名字、参数必 须完全系统。 •2.只有类的成员函数才能是虚函数。 这样才能与具体对象相联结,以实现 不同类对象的同一函数的“多态”。 •3.静态成员函数不能说明为虚函数。
16
接上页
• 4.虚函数不能是内联的。因为它实现了动态联编。假如在类内进 行了定义,也认为它是非内联的。
• 当使用对象指针或对象引用调用虚函数时,采用动态联编方式,即在运 行时进行关联或绑定。
9
例1
• class employee{ ... • public: • virtual whoami(){ …} • ..}; • class manager:public employee{ ... • public: • virtual whoami(){ …} • ..};
14
接上例
• void main(){
• A demo1,*p; • B demo2;
同一样的语句,有不同 的行为
• p=&demo1;
• p->show(); 显示“class A show() is called”
• p=&demo2;
• p->show(); 显示”class B show() is called”
第5章 虚函数与多态性
说明: 1.多态性是OOP的重要组成部分。 它是 C++中的难点之一。C++的多态性是靠虚 函数实现的。实际上虚函数使类的成员 函数表现出多种形态。 2.虚函数的形式十分简单,要领会其实 质则不简单。
1
本章主要内容
• 多态性的概念和多态类型 • 联编 • 虚函数 • 抽象类 • 运算符重载
4
静态联编
• 在编译阶段完成的联编称为静态联编。 • 在编译过程中,编译系统可以根据类型匹配等特 征来确定程序中调用操作与执行某个同名函数实 现之间的关系,即确定某一个同名函数到底是要 调用哪一段函数实现代码。 • 函数重载和运算符重载就是通过静态联编方式实 现的编译时的多态的体现。 • 静态联编的优点是函数调用速度快、效率较高, 缺点是编程不够灵活。
12
上述例子实现了一个 whoami() 函 数有三种行为,即多态 。
•这是关于多态性的语法方面的分析 理解。 •为了进一步形象地理解多态,见下 例:
13
例2
• class A{public:virtual void show() • {cout<<“class A show() is called”<<endl;} • }; • class B:public A • {public: void show() • {cout<<“class B show() is called”<<endl;} • };
• 5.构造函数不能是虚函数。 • 6.析构函数可以为虚函数,此时虚析构函数的名字为“~类型
名”。以实现其“多态”地撤消不同类对象。
17
接上页
• 7.虚函数的“虚拟性”可以“继承”。即基类写了关键字 virtual 后,派生类的同名、同参数、同类型函数也是虚函数,可以不写 virtual 。多层继承时,如中间类不写虚函数,其后的派生类需要 时重新定义即可。即不会出现虚拟继承的传递路径中断。
• 8.注意虚函数与虚基类的区别。
18
接上页
• 9.虚函数实现多态,只能通过指针或引用进行。因为只有这样, 才能实现动态联编。
• 10.多态可简单地理解为:同一名字多种含义。如:
BASKETBALL
Leabharlann Baidu
PLAY
FOOTBALL
PINGPONGBALL
19
再接上页
• 11.派生类内可以调用基类的虚函数。但为了保 持不破坏多态,一般不提倡这样做。 • 12.虚函数的存取决定于首次定义它的基类中该 函数是公有还是私有。如果是公有,派生类中仍 然是公有;如果是私有,派生类中仍然是私有。 • 13.注意虚函数与重载函数的区别。见下页