多态通过运行状态区分可分为静态多态和动态多态:
1、静态多态可以理解为相同对象接收不同消息产生不同结果
2、动态多态可以理解为相同对象接收相同消息产生不同结果
静态多态为重载实现,而动态多态为虚函数实现
动态多态的实现需要继承来支撑,如下面代码:
class A
{
public:
virtual void foo()
{
cout<<"A::foo() is called"<<endl;
}
};
class B:public A
{
public:
void foo()
{
cout<<"B::foo() is called"<<endl;
}
};
int main(void)
{
/* A *a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
return 0; */
A a;
B b;
a=b;
a.foo()
return 0;
}
可以看出通过继承和使用指针或者赋值可以很好地理解虚函数的作用。
虚函数包括普通虚函数,虚析构函数(为了释放在创建类对象是使用new在堆上创建的对象),纯虚函数构成抽象类。
附加一些关于生成对象时内存占用知识:
内存的分配方式有三种
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束后在将这些局部变量的内存空间回收。在栈上分配内存空间效率很高,但是分配的内存容量有限。
(3) 从堆上分配的。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。
在大部分情况下,多态是离不开继承。通过继承更好的实现多态。