您的位置:首页 > 其它

谈谈自己对面向对象的理解

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,仍然调用父类方法



内存模型:



指针的虚表指向子类方法地址



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: