A*pA = new B()中会开辟类型B的空间吗
时间: 2024-01-03 20:04:52 浏览: 30
是的,A*pA = new B()会在堆中开辟一个类型B的空间,并将该空间的地址赋值给指针pA。由于A是B的基类,因此pA可以指向B类型对象的地址。这种操作被称为动态内存分配,它可以在程序运行时动态地创建和销毁对象,提高了程序的灵活性和效率。但是需要注意的是,使用完毕后应该手动释放内存,否则会造成内存泄漏。
相关问题
已知下面的class层次,其中每一个class都定义有一个default constructor和一个virtual destructor: class Xf...};class A[..};class B:public A(...}; class C:public B[...}; class D:public X,public C{...}; 下面()执行dynamic cast会失败 A.A *pa=new D;X *px=dynamic cast<X*>(pa); B.D *pd=new D;A *pa=dynamic cast<A*>(pd); C.B *pb=new B;D *pd=dynamic cast<D*>(pb); D.A *pa=new C;C *pc=dynamic cast<C*>(pa)
以下是每个dynamic cast的结果:
1. `X *px=dynamic_cast<X*>(pa);`
这个dynamic cast会成功,因为D是X的公有派生类,所以指向D对象的A指针可以转换为指向X对象的X指针。
2. `A *pa=dynamic_cast<A*>(pd);`
这个dynamic cast会成功,因为D是从B公有派生而来,B是从A公有派生而来,所以指向D对象的B指针可以转换为指向A对象的A指针。
3. `D *pd=dynamic_cast<D*>(pb);`
这个dynamic cast会失败,因为B并不是D的公有派生类,所以指向B对象的B指针不能转换为指向D对象的D指针。
4. `C *pc=dynamic_cast<C*>(pa);`
这个dynamic cast会失败,因为C不是A的公有派生类,所以指向C对象的A指针不能转换为指向C对象的C指针。
以下代码能不能实现两数交换呢?为什么? int a = 10; int b = 20; int *pa = &a; int *pb = &b; int *pc = NULL; *pc = *pa; *pa = *pb; *pb = *pc; printf("%d %d\n", a, b);
这段代码无法实现两数交换,因为指针变量 `pc` 被赋值为 `NULL`,然后试图通过 `*pc = *pa` 将 `a` 的值赋给 `NULL` 所指向的内存空间,这是错误的操作,会导致程序崩溃。正确的做法是把 `pc` 指向 `a` 或者 `b` 的地址,即 `pc = &a` 或 `pc = &b`,然后再进行交换操作。修正后的代码如下所示:
```
int a = 10;
int b = 20;
int *pa = &a;
int *pb = &b;
int *pc = NULL;
pc = pa;
pa = pb;
pb = pc;
printf("%d %d\n", a, b);
```
输出结果为 `20 10`。