C++语法问题

Clerk_9919 2003-05-27 06:19:58
class A
{
};
class B:public A
{
public:
void funB(){};
};
class C:virtual public A //这里是虚继承
{
public:
void funC(){};
};
int main()
{
A *paB, *paC;
paB = new B;
paC = new C;
static_cast< B* >( paB )->funB();
static_cast< C* >( paC )->funC(); //这里不能通过编译
delete paB;
delete paC;
}

有没有办法在不修改类的前提下,用paC调用funC()???
...全文
29 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Clerk_9919 2003-05-28
  • 打赏
  • 举报
回复
如果有人有更好的办法, 请告诉我, 我再给分
Clerk_9919 2003-05-28
  • 打赏
  • 举报
回复
非常感谢eric8231(小诗)
果然可以

我看了MSDN, 里面说reinterpret_cast可以将任何型别的指针转为另外一种型别的指针, 它是强行转换的, 所以不安全, 不推荐使用.

以前我真的没注意过还有这么一个东西!!还得学啊!!
:)

cloudtarget 2003-05-28
  • 打赏
  • 举报
回复
reinterpret_cast
-----------------------
重新解释,C++大学教程上好像有
Wendydd 2003-05-28
  • 打赏
  • 举报
回复
eric8231(小诗) 说的没错
这样就可以通过,而且不用修改类定义
好像reinterpret_cast平台相关,书上说的也少,所以没有用过。
可否解释一下?
eric8231 2003-05-27
  • 打赏
  • 举报
回复
了无生趣的办法:
reinterpret_cast< C* >( paC )->funC();
Clerk_9919 2003-05-27
  • 打赏
  • 举报
回复
谢谢 Wendydd(温迪)

不过你说的方法我知道, 在A类中只要有任意的一个虚函数,表示出要使用多态,再使用dynamic_cast转型就可以通过.不仅仅是虚析构函数.

我想A类没有虚函数时不能用dynamic_cast转型也许是为了优化,因为省去了虚表等等的额外开销.

但是我更希望能找到不修改类而转型的方法!!!现在看来是渺茫了! :(
cenphoenix 2003-05-27
  • 打赏
  • 举报
回复
我觉得Cauty45(车行天)没错,楼主最好还是修改类。
egyptnile 2003-05-27
  • 打赏
  • 举报
回复
虚继承强调要重置虚基类的方法,这里基类中没有方法,而在C中要用,所以不行
shishiXP 2003-05-27
  • 打赏
  • 举报
回复
不行吧

C:A
B:A
C怎么用B的东西?
Wendydd 2003-05-27
  • 打赏
  • 举报
回复
David2008(心中只有你)说的对,多态不是这样用的。

但是我看楼主没有用多态的意思,而是来想个安全向下转型,这样的用法还是可以理解的。不过这种事情还是少做一点的好,而且用dynamic_cast要好一点。

给一个参考吧,类还是要修改的,但是只要把A的析构函数声明成 virtual 的就行了。毕竟,dynamic_cast是给多态体系用的。


class A
{
public:
virtual ~A() {}
};

class B:public A
{
public:
void funB(){}
};

class C:virtual public A //这里是虚继承
{
public:
void funC(){}
};

int main()
{
A *paB, *paC;
paB = new B;
paC = new C;
dynamic_cast<B*>( paB )->funB();
dynamic_cast<C*>( paC )->funC(); //这里不能通过编译
delete paB;
delete paC;

return 0;
}


这个程序在WinXP/Dev-cpp4980下面可以通过
David2008 2003-05-27
  • 打赏
  • 举报
回复
不行
其实,C++的多态性不是这样用的

1。我没有见过有虚继承的用法
2。指向基类对象的指针可以指向该基类的公有派生类对象,而反过来是不行的
但是,你的程序却是反着用的 (这个是多态性的基础)
:)
建议你修改类
Wendydd 2003-05-27
  • 打赏
  • 举报
回复
Sorry,楼上的方法可以,只要把static_cast去掉就行了。
但是楼主在说不改类定义前提下。。。。。。
lqqchen2003 2003-05-27
  • 打赏
  • 举报
回复
楼上的方法不行。
看来要去查看标准进行补习。
Wendydd 2003-05-27
  • 打赏
  • 举报
回复
楼上的方法不行
是由上向下的指针映射出错。
Cauty45 2003-05-27
  • 打赏
  • 举报
回复
试试:
class A
{
public:
virtual void funC(){};
};
superzrb 2003-05-27
  • 打赏
  • 举报
回复
gz

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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