关闭

C++的多态与切片问题

发表于:2013-3-18 10:19

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Maxwell_    来源:51Testing软件测试网采编

  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 都被分配了一块内存空间,当然,这块内存空间存在于栈空间中

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号