C++内存分配的方式大体上可以归纳为3种
1)从静态存储区中分配:内存在编译时就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,static变量
2)在栈上分配:执行函数时,函数内局部变量的存储单元都可在栈上创建,函数执行结束时,这些存储单元自动被释放
3)在堆上分配:也称为动态内存分配,程序在运行的时候用malloc或new申请任意多少的内存,除非程序运行结束或者程序员自己用free或delete释放动态内存,否则这块动态内存一直存在
多态性是指为一个函数名关联多种含义的能力,即同一种调用方式可以映像到不同的函数。这种把函数的调用与适当的函数体对应的活动又称为绑定(binding)。根据绑定所进行阶段的不同,可分为早期绑定(early binding)、晚期绑定(late binding),早期绑定发生在程序的编译阶段,称为静态联编(static binding),晚期绑定发生在程序的运行阶段,称为动态联编(dynamic binding)。
1)早期绑定(Early Binding):也称为编译期多态,指绑定是发生在编译阶段。
1 //: Poly.cpp 2 #include <iostream> 3 4 using namespace std; 5 6 class A { 7 public: 8 A() : x(5) {} 9 virtual void foo() { 10 cout << "x = " << x << endl; 11 } 12 13 int x; 14 }; 15 16 class B : public A { 17 public: 18 B() : y(10) {} 19 virtual void foo() { 20 cout << "x = " << x << endl; 21 cout << "y = " << y << endl; 22 } 23 24 int y; 25 }; 26 27 int main() { 28 A a; 29 B b; 30 31 b.x = 1; 32 b.y = 2; 33 34 a = b; 35 a.foo(); 36 b.foo(); 37 38 return 0; 39 } ///:~ |
A是基类,B是派生类,其中 a = b 存在向上映射的关系,可以认为向上映射总是安全的,因为是从更专门到更为一般
在编译期完成后,对象 a 和 b 都被分配了一块内存空间,当然,这块内存空间存在于栈空间中