65,210
社区成员
发帖
与我相关
我的任务
分享
// A类只有接口,B,C均没有重写函数fun,知道A有运行时类信息的封装
class A
{
public:
virtual void fun(){ /*Do someting */ }
};
class B :public A{ };
class C: public A{ };
int main()
{
B *pB = new B;
C *pC = new C;
pB->fun();
pC->fun();// the result is diffrent from pB->fun();
}
[/quote]
你都没看懂我的意思,将b转换成c,这两个怎么就是继承关系了呢?
如果指针已经确实是子类,非b即c,将b强制转换成c肯定会有异常。
将父类转换成子类,肯定返回null。
所以如果某指针不指向c,而强行将它转换成c,转换的结果一定可以说明它是不是c。[/quote]
大概是我描述有点不准确,我是要明确知道哪个子类(不一定是2个,在实际项目中有5 6 个直接子类,执行结果是不一样的)。
我也明白你的意思,不过只能试用在两个子类之间吧?!
class B;
class C;
class A
{
public:
virtual void fun();
};
class B :public A{ };
class C: public A{ };
void A::fun()
{
B *pb = dynamic_cast<B*>(this);
if (pb != NULL)
{
printf("class B\n");
}
C *pc = dynamic_cast<C*>(this);
if (pc != NULL)
{
printf("class C\n");
}
}
int main()
{
B *pB = new B;
C *pC = new C;
pB->fun();
pC->fun();// the result is diffrent from pB->fun();
}
[/quote]
你都没看懂我的意思,将b转换成c,这两个怎么就是继承关系了呢?
如果指针已经确实是子类,非b即c,将b强制转换成c肯定会有异常。
将父类转换成子类,肯定返回null。
所以如果某指针不指向c,而强行将它转换成c,转换的结果一定可以说明它是不是c。
class A
{
public:
virtual void fun(){ /*Do someting */ }
};
class B :public A{ };
class C: public A{ };
int main()
{
A *pA1 = new B;
A *pA2= new C;
printf("%s",typeid(*pA1).name());
printf("%s",typeid(*pA2).name());
}
没试过不保证对
另,别纠结这些东西了,你知道dynamic_cast<&A::fun>( pA1->vptr[1])是个什么东西吗?
