谈谈自己对面向对象的理解
2016-08-06 16:15
435 查看
三个特征
#include<string> #include<iostream> using namespace std; class bird { public: void eat() { cout << "bird is eating" << endl; } void sleep() { cout << "bird is sleeping" << endl; } void fly(); }; class ostrich { public: eat() { smallBird.eat(); } sleep() { smallBird.sleep(); } private: bird smallBird; }; int main() { ostrich xiaoq; xiaoq.eat(); xiaoq.sleep(); return 0; }
View Code
多态
多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。a.编译时多态性:通过重载实现 静态 早绑定(编译时绑定)
b 运行时多态性:通过覆盖实现 动态 晚绑定(运行时绑定)
注意如果说面向对象的多态不包括重载:重载编译时就确定了,是静态,是一种语言特性,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。”
overide(覆盖)和overload(重载)
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中)
(2)函数名字相同
(3)参数不同
(4)virtual 关键字可有可无
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类)
(2)函数名字相同
(3)参数相同
(4)基类函数必须有virtual 关键字
C++对象模型告诉你如何实现多态,有两个概念可以解释C++对象模型:
语言中直接支持面向对象程序设计的部分。
对于各种支持的底层实现机制。
多态是通过重载(虚函数)实现的,下一篇讲C++对象模型
动态绑定例子
#include <iostream> using namespace std; class Base { public: void fun1(){ cout << "Base fun1" << endl; } virtual void fun2(){ cout << "Base fun2" << endl; } private: int a; }; class Derive : public Base { public: void fun1(){ cout << "Derive fun1" << endl; } void fun2(){ cout << "Derive fun2" << endl; } virtual void fun3(){} private: int b; }; int main() { Base b; Derive d; Base *p = &d; p->fun1(); p->fun2(); system("pause"); return 0; }
输出:基类指针p在运行时发生动态绑定,fun2调用子类方法,fun1由于没有virtual,仍然调用父类方法
内存模型:
指针的虚表指向子类方法地址
相关文章推荐
- 谈谈自己对销售和技术的理解
- 面试题:有一句格言:“人不一定能使自己伟大,但一定可以使自己崇高”请你联系实际谈谈对这一格言的理解。
- 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- 简单谈谈自己对htm与css中画圆的理解。
- 写下自己对面向对象的理解吧,开始很乱,整理后清晰了不少
- 谈谈对js面向对象的理解
- (自己的理解)面向对象和面向过程的区别
- 谈谈你对面向对象的理解
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- 谈谈自己对java访问控制的理解
- 谈谈自己对文件描述符的理解
- 面试题-谈谈对面向对象的理解
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- 谈谈自己对面向对象的认识。
- 谈谈自己对技术的理解
- 简单谈谈自己对SSH框架的理解
- 谈谈自己对正则化的一些理解~
- 谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- java抽象类与接口的区别(谈谈自己的理解)