虚函数,多态性,回调函数 简述
2017-03-13 14:27
134 查看
0. object based, object oriented.
都是用对象机制对数据进行封装,提高代码复用率,缩知问题空间与解空间之间的距离。
1. 基于对象编程语言 (Object_based program); VC++;只是简单的数据封装,合成, 而没有面向对象那种继承导致的类层次结构,也就不能体现多态性。
1.1 多态性从语法角度上讲就是通过基类的指针、引用、句柄来操纵大量派生类的实例,从而执行派生类各自的具体方法,这样基类的一个接口就可以运行它的不同派生类的相同接口从而表现不同的行为。
1.2 C++被设计成是默认的object based,也就是如果在使用的时候不进行明确声明,它是不会体现多态性的。
这是考虑到实现多态性会增加系统的额外开销,因为compiler会为多态性的类层次结构增加虚函数表机制,会进行动态绑定等等诸多复杂操作。
如果一个简单的设计不需要这么复杂的方法,显然是多余的。
这就是Stroustrup在设计最初版本C++时所说的“not use it , not cost for it”.
1.3 VC++中虚函数实现多态性举例说明:
// virtual.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
class Base
{
public: int virtual print()
{
cout<<"base"< return 0;
}
};
class Son:public Base
{
public: int virtual print()
{
cout<<"son"< return 0;
}
};
int _tmain()
{
Base b;
Son s;
Base *p;
p=&b;
p->print(); //Base::print();
p=&s;
p->print(); //Son::print();
return 0;
}
结果:
base
son
1.3.1 通过基类指针指向不同的子类对象,调用相同名称的函数,但调用的实际是子类各自的函数。that is, 基类或者子类的对象可以赋值给一个基类指针。通过指针可以调用各自的函数。
1.3.2 如果不使用基类的指针,则不能完成多态性
// virtual.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
class Base
{
public: int virtual print()
{
cout<<"base"< return 0;
}
};
class Son:public Base
{
public: int virtual print()
{
cout<<"son"< return 0;
}
};
int _tmain()
{
Base b;
b.print();//Base::print();
return 0;
}
结果:
base
1.4 overload 和 override
虚函数总是在派生类中被改写,这种改写被称为“override”或“overload”
1.4.1 override 是指派生类重写基类的虚函数,重写的函数必须有一致的参数表和返回值,有些人称此动作为“覆盖”
1.4.2 overload 是指编写一个与已有函数同名但是参数表不同的函数。例如一个函数既可以接受整型数作为参数,也可以接受浮点数作为参数。
1.5 使用virtual 关键字 ,类层次
class A
{
public:
virtual void foo();
};
class B: public A
{
public:
void foo(); // 没有virtual关键字!
};
class C: public B // 从B继承,不是从A继承!
{
public:
void foo(); // 也没有virtual关键字!
};
这种情况下,B::foo()是虚函数,C::foo()也同样是虚函数。因此,可以说,基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字。
1.6 纯虚函数
如下声明表示一个函数为纯虚函数:
class A
{
public:
virtual void foo()=0; // =0标志一个虚函数为纯虚函数
};
一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。
//先到此吧~
2. 面向对象编程语言 (object oriented program); Java; 它的多态性是默认的,且不能改变的。
2.1 多态性是通过动态绑定实现的,动态绑定就是在运行期间将一个方法主体和方法联系起来。
3.动态绑定在C++中需要一个开关来打开,这个开关就是关键字:virtual,而被标为virtual 的函数就叫做虚函数。一旦一个类层次结构被表示为virtual的,也就是基类的方法为virtual的,那么在运行期间,当被基类句柄表示的派生类实例进行方法调用时,动态绑定机制就开始起作用了。
都是用对象机制对数据进行封装,提高代码复用率,缩知问题空间与解空间之间的距离。
1. 基于对象编程语言 (Object_based program); VC++;只是简单的数据封装,合成, 而没有面向对象那种继承导致的类层次结构,也就不能体现多态性。
1.1 多态性从语法角度上讲就是通过基类的指针、引用、句柄来操纵大量派生类的实例,从而执行派生类各自的具体方法,这样基类的一个接口就可以运行它的不同派生类的相同接口从而表现不同的行为。
1.2 C++被设计成是默认的object based,也就是如果在使用的时候不进行明确声明,它是不会体现多态性的。
这是考虑到实现多态性会增加系统的额外开销,因为compiler会为多态性的类层次结构增加虚函数表机制,会进行动态绑定等等诸多复杂操作。
如果一个简单的设计不需要这么复杂的方法,显然是多余的。
这就是Stroustrup在设计最初版本C++时所说的“not use it , not cost for it”.
1.3 VC++中虚函数实现多态性举例说明:
// virtual.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
class Base
{
public: int virtual print()
{
cout<<"base"< return 0;
}
};
class Son:public Base
{
public: int virtual print()
{
cout<<"son"< return 0;
}
};
int _tmain()
{
Base b;
Son s;
Base *p;
p=&b;
p->print(); //Base::print();
p=&s;
p->print(); //Son::print();
return 0;
}
结果:
base
son
1.3.1 通过基类指针指向不同的子类对象,调用相同名称的函数,但调用的实际是子类各自的函数。that is, 基类或者子类的对象可以赋值给一个基类指针。通过指针可以调用各自的函数。
1.3.2 如果不使用基类的指针,则不能完成多态性
// virtual.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
class Base
{
public: int virtual print()
{
cout<<"base"< return 0;
}
};
class Son:public Base
{
public: int virtual print()
{
cout<<"son"< return 0;
}
};
int _tmain()
{
Base b;
b.print();//Base::print();
return 0;
}
结果:
base
1.4 overload 和 override
虚函数总是在派生类中被改写,这种改写被称为“override”或“overload”
1.4.1 override 是指派生类重写基类的虚函数,重写的函数必须有一致的参数表和返回值,有些人称此动作为“覆盖”
1.4.2 overload 是指编写一个与已有函数同名但是参数表不同的函数。例如一个函数既可以接受整型数作为参数,也可以接受浮点数作为参数。
1.5 使用virtual 关键字 ,类层次
class A
{
public:
virtual void foo();
};
class B: public A
{
public:
void foo(); // 没有virtual关键字!
};
class C: public B // 从B继承,不是从A继承!
{
public:
void foo(); // 也没有virtual关键字!
};
这种情况下,B::foo()是虚函数,C::foo()也同样是虚函数。因此,可以说,基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字。
1.6 纯虚函数
如下声明表示一个函数为纯虚函数:
class A
{
public:
virtual void foo()=0; // =0标志一个虚函数为纯虚函数
};
一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。
//先到此吧~
2. 面向对象编程语言 (object oriented program); Java; 它的多态性是默认的,且不能改变的。
2.1 多态性是通过动态绑定实现的,动态绑定就是在运行期间将一个方法主体和方法联系起来。
3.动态绑定在C++中需要一个开关来打开,这个开关就是关键字:virtual,而被标为virtual 的函数就叫做虚函数。一旦一个类层次结构被表示为virtual的,也就是基类的方法为virtual的,那么在运行期间,当被基类句柄表示的派生类实例进行方法调用时,动态绑定机制就开始起作用了。
相关文章推荐
- 【原创】多态性、动态多态性、静态多态性、虚函数、纯虚函数、抽象类总结
- c++ 继承 虚函数与多态性 重载 覆盖 隐藏
- c++ 继承 虚函数与多态性 重载 覆盖 隐藏
- 第十三周任务一(通过程序分析理解虚函数, 多态性和抽象类)
- 虚函数和多态性2——抽象基类和纯虚函数
- C++编程思想学习笔记---第15章 多态性和虚函数
- 6.14作业,建立3个container的派生类cube,sphere,cylinder,让每一个派生类都包含虚函数surface_area()和volume(),写出主程序,应用于c++的多态性
- 多态性和虚函数
- 类的虚函数和多态性
- C++重载 虚函数 纯虚函数 多态性
- 第十四周--多态性、虚函数和抽象类(2)
- 【虚函数】SDUT 2680 - 6-2 多态性与虚函数
- 多态性与虚函数
- 【2680】6-2 多态性与虚函数
- 程序实践系列(九)多态性和虚函数
- 面向对象的程序设计-5-多态性和虚函数-part1
- 明明白白c++ 虚函数和多态性
- 虚函数和多态性
- c++ 虚函数和多态性
- 【一天一篇CPP】多态性和虚函数和虚析构函数和纯虚函数和抽象类