C++的几个边缘问题~~~哪位好心人帮我查一下标准~~

redleaves 2007-02-05 12:46:25
现在手头没有标准文档,谁帮我查一下有关以下几个问题的标准定义..先谢过了!!!

1.
class A{
virtual void f();
};
class B {
virtual void f();
};
class C : public A, public B {
void f();
};
在上例中,class C中的f改写了A,B中的函数f.如何分别改写A和B里的f.因为有可能A,B中,f的含意不同...

2.
template< template<typename> class _T >
class A{
};
template< typename _T >
class B : public A< B > {
typedef A< B > BaseType;
};
在例2中,A<B>这种写法,有些编译器是无法编译的.因为C++中,模板的名称解析规则里,对于这种不完整而又没有歧义的类型名B,可以看作B<_T>.而A的模板参数要求是模板.这里就不能看做是B<_T>.在VC8里,public A<B>处B没有被当做B<_T>,而typedef处,却当作了B<_T>.不知道有什么解决办法.
当然,对于编译器来说,要分辨出这些情况,是很简单的事.但我不记得标准对这种东西有没有什么说法了.
...全文
398 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2007-02-05
  • 打赏
  • 举报
回复
第一问,无解。不要让它们同名(或者说类型完全相同)。
第二问,template< template<typename> class _T >
class A{
};
template<typename _T> class B;
typedef A<B> BaseType;
template< typename _T >
class B : public BaseType {
};
redleaves 2007-02-05
  • 打赏
  • 举报
回复
楼上的同志没看清楚我的意思吧~
就是因为是虚函数(纯虚也一样),才会有需要分别重写的情况出现。比如一个对象需要实现两个接口,接口中有相同的函数,行为却有区别....
当然,在自己的设计中,不会让这种情况出现.但给别人的接口做实现的时候,就身不由己了.
而且也不是没有解决办法,我上面都说了,只要分别在继承体系中加一层中间层.把相应的接口分别实现.就可以了.
只是想看一下标准中有什么规定~~
呵呵,还是晚上回家自己看标准去吧.
北极猩猩 2007-02-05
  • 打赏
  • 举报
回复
问题1
C++的语法中没有提供你所需要的这种选择性覆盖,其实从设计角度出发比较好的解决方案时,让A和B中的函数f都成为纯虚函数这样就不用考虑究竟覆盖那个的问题了:)
redleaves 2007-02-05
  • 打赏
  • 举报
回复
没人帮我查一下标准么?
其实这两种东西都是有解法的。只要加个中间层,都可以解决...
只是想看一下标准是怎么定义的....
jixingzhong 2007-02-05
  • 打赏
  • 举报
回复
类似这样的问题是需要的编码时候避免的一个问题 ~
jixingzhong 2007-02-05
  • 打赏
  • 举报
回复
1 歧义了
redleaves 2007-02-05
  • 打赏
  • 举报
回复
呵呵,事实上是可以用其它的写法来代替。关键是我想看一下标准是怎么说的。
taodm 2007-02-05
  • 打赏
  • 举报
回复
事实优先于标准。
redleaves 2007-02-05
  • 打赏
  • 举报
回复
TO blh:
我是要重写虚函数,而不是使用....
blh 2007-02-05
  • 打赏
  • 举报
回复
C;
void f()
{
// 如果要使用A的f
A::f();
// 如果要使用B的f
B::f();
}
redleaves 2007-02-05
  • 打赏
  • 举报
回复
呵呵,多谢楼上的回答。不过我想知道的是在标准中的定义....

64,654

社区成员

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

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