高手来回答两个问题

hyifeng 2004-03-31 08:32:08
1>

在C#或Java中可以定义一个不包含方法的interface,如:
interface Itf
{
}


在C++中用具有纯虚函数的抽象类来模拟interface的功能,
可是在这种情况下的interface,C++该如何给出一个意义相当的实现?

2>

interface Itf {};

class A : public Itf {
};

class B : public Itf {
};

void do_something(Itf* ptr){
// 这里怎样能把ptr正确的转型为A*或B*
}

万分感谢

...全文
79 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2004-04-01
  • 打赏
  • 举报
回复
class Itf {
public:
virtual ~Itf() = 0;
};
void Itf::~Itf(){}
cgsw12345 2004-04-01
  • 打赏
  • 举报
回复
1>

在C#或Java中可以定义一个不包含方法的interface,如:
interface Itf
{
}

在C++中用具有纯虚函数的抽象类来模拟interface的功能,
可是在这种情况下的interface,C++该如何给出一个意义相当的实现?
---这种情况下一般不需要给出有意义的实现(你想想纯虚函数不就是只在基类提
供声明,而派生类提供定义的函数吗)
对于普通的虚函数一般只提供缺省的定义,如果不知道就什么也不做或直接声明为
纯虚函数。
2>

interface Itf {};
class A : public Itf {
};
class B : public Itf {
};
void do_something(Itf* ptr){
// 这里怎样能把ptr正确的转型为A*或B*
}
--------若基类有虚函数,而且一般都应有
所以在do_something函数将会调用正确的实现
函数(基类或派生类)而不需要我们知道它具体的
基类对象还是派生类对象,当然,如果真要知道
它的真实类型可以使用dynamic_cast和typeid但这两个
运算符一个必要条件就是在类中一定要最少存在一(纯)虚函数
否则将得不到正确的类型!
但还是建议不到万不得以就不要使用dynamic_cast和typeid,它不仅在
很大的开销,而且不太符合多态的思想!
具体是怎么不符合在一般好点的书中都可以讲到!
hyifeng 2004-04-01
  • 打赏
  • 举报
回复
Wolf0403,谈谈你那段程序的工作原理好吗?
hyifeng 2004-04-01
  • 打赏
  • 举报
回复
没有一个虚函数不能使用dynamic_cast进行向上转型(是不是因为没有形成虚表?),怪不得编译不通过。

哎,我对C++了解太肤浅了,谢谢大家指导。
hyifeng 2004-04-01
  • 打赏
  • 举报
回复
不明白 Wolf0403 程序,为什么 =0,然后又 void Itf::~Itf(){},
为什么会这样?
happlyman 2004-03-31
  • 打赏
  • 举报
回复
同意楼上的做法!
hpho 2004-03-31
  • 打赏
  • 举报
回复
void do_something(Itf* ptr){
A* pa = static_cast<A*>(ptr);
B* pb = static_cast<B*>(ptr);
}

- or -

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

class A : public Itf {
};

class B : public Itf {
};

void do_something(Itf* ptr){
A* pa = dynamic_cast<A*>(ptr);
B* pb = dynamic_cast<B*>(ptr);
}

64,637

社区成员

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

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