Upcast、Downcast的问题,求救!

KyosukeNo1 2005-09-26 10:19:43
小弟的程序需要动态分配出一个类的数组(CB* pB = new CB[3];),之后需要把这个数组的指针作为参数传递到函数里(void test( CA* pA, int num )),其中CA是CB的父类。之后在test函数里把这个指针当作CA来使用(在实际的工程中,test函数是某个只是使用了CA功能、而且不能被改变的部分)。还有,所有处理结束之后,指针pB还需要作为CB的指针来使用的。请问怎么做才能正确的Upcast和Downcast呢?
例程如下(现在的程序只能Upcast了数组里的第一个元素,其他的都无法改变):
class CA {
public:
void setA( int num ) { a = num; }
void doSth() {
printf( "A is: %d\n", a );
}
CA() { a = 0; };
private:
int a;
};

class CB : public CA {
public:
void setB( int num ) { b = num; }
void doSth() {
printf( "B is: %d\n", b );
}
CB() { b = 0; };
private:
int b;
};

void test( CA* pA, int num )
{
for( int i=0; i<num; i++ ) {
pA[i].doSth();
}
}

int main(int argc, char* argv[])
{
CB* pB = new CB[3];
pB[0].setA(1);
pB[1].setA(2);
pB[2].setA(3);

test( dynamic_cast<CA*> (pB), 3 );

int nTest;
nTest = getchar();
return 0;
}
...全文
297 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qhfu 2005-09-27
  • 打赏
  • 举报
回复
对的
KyosukeNo1 2005-09-27
  • 打赏
  • 举报
回复
对了,顺便想问一个比较蠢的问题:
CA** ppB = new CA*[3];这样分配的空间,怎么释放?是要循环每个指针指向的空间,先把这个Delete掉,然后再执行delete[] ppB吗?指针太多,脑袋已经完全混乱了。。。
zhouhuahai 2005-09-27
  • 打赏
  • 举报
回复
qhfu(崩溃) 写的程序没用virtual, 不会引发多态机制.

请问怎么做才能正确的Upcast和Downcast呢?
从派生类对象指针到基类对象指针的upcast是安全的,而且只有这样,才能进行多态.
反之,则用dynamic_cast<derived *>(..)进行转换.
KyosukeNo1 2005-09-27
  • 打赏
  • 举报
回复
但dynamic_cast只能对单个的实例有效,对于实例的数组来说还是没办法。。。
KyosukeNo1 2005-09-26
  • 打赏
  • 举报
回复
楼上的方法太有趣了,不愧是大师级的人物!

在其他论坛,有人给出了这个Upcast问题解释,顺便Post出来 :-)

================================================================
C++ has a serious gotcha with this
http://geneura.ugr.es/~jmerelo/c++-...nheritance.html
Scroll down to "[21.4] Is an array of Derived a kind-of array of Base?"
================================================================

这个问题看来挺有趣的,先在这里留两天再结贴,看看有没有其他的方法来解决
qhfu 2005-09-26
  • 打赏
  • 举报
回复
class CA {
public:
void setA( int num ) { a = num; }
void doSth() {
printf( "A is: %d\n", a );
}
CA() { a = 0; };
private:
int a;
};

class CB : public CA {
public:
void setB( int num ) { b = num; }
void doSth() {
printf( "B is: %d\n", b );
}
CB() { b = 0; };
private:
int b;
};

void test( CA** pA, int num )
{
for( int i=0; i<num; i++ ) {
pA[i]->doSth();
}
}

int main(int argc, char* argv[])
{
CA** ppB = new CA*[3];
for (int i = 0;i<3;i++)
ppB[i] = new CB();
ppB[0]->setA(1);
ppB[1]->setA(2);
ppB[2]->setA(3);

test( ppB, 3 );

int nTest;
nTest = getchar();
return 0;
}

这样可以吗?
Jagen在路上 2005-09-26
  • 打赏
  • 举报
回复
这个没有关系的,可以进行强制类型转换的。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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