new对象数组失败,100分相送

zkszks 2004-11-22 09:49:04
struct A
{
virtual ~A(){}
virtual void Init(void)
{
//
}
};
struct B: public A
{
int i;
void Init(void)
{
//
}
};

若“A *pA = new B[10];”时,“&pA[1]”是无效的。
如B中无成员变量,则OK。
...全文
123 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2004-11-22
  • 打赏
  • 举报
回复
多态是将父类的指针可以访问子类的成员,而楼主用子类来访问父类
oyljerry 2004-11-22
  • 打赏
  • 举报
回复
强制类型转换了
nlstone 2004-11-22
  • 打赏
  • 举报
回复
这样的做法是错误的...
A[1]会访问到一个错误的地址,因为编译器只会老实地以A++这种方式来访问下一个A
alphakiller 2004-11-22
  • 打赏
  • 举报
回复
你这样写再试试
A *pA;
B b = new B[10];
pA=(A*)(&b);
快乐鹦鹉 2004-11-22
  • 打赏
  • 举报
回复
你这个方法没有什么问题。使用时强制转换成B指针进行使用就没有问题了。
handwolf 2004-11-22
  • 打赏
  • 举报
回复
当然了,继承类有成员的话,大小肯定比父类大!
但是[]运算符是按照父类的大小来进行的!
楼主明白了没?
danyueer 2004-11-22
  • 打赏
  • 举报
回复
你的声明看起来没有错误,不过“&pA[1]”似乎是一个指向指针的指针,取这个对象该用 *pA[1] 吧?
zkszks 2004-11-22
  • 打赏
  • 举报
回复
主要是为了使用多态,有不有更好的?
快乐鹦鹉 2004-11-22
  • 打赏
  • 举报
回复
如果是无效指针那就有问题了,也不应该啊。
如果看不到i的值,那是肯定的。因为你看的是A对象,而不是B对象。强制转换为B就看到了。
快乐鹦鹉 2004-11-22
  • 打赏
  • 举报
回复
无效是指指针为无效指针,还是看不到i的值呢?
快乐鹦鹉 2004-11-22
  • 打赏
  • 举报
回复
“&pA[1]”是无效的。==》什么意思?你的“无效”指什么?
alphakiller 2004-11-22
  • 打赏
  • 举报
回复
刚刚在看深入浅出MFC,看看是不是这个问题:

你知道,衍生对象通常都比基础对象大(我是指内存空间),因为衍生对象不但继承其基础类别的成员,又有自己的成员。那么所谓的upcasting(向上强制转型):将会造成对象的内容被切割.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧