读书人

C++的几个边缘有关问题~哪位好心人帮小

发布时间: 2012-02-20 21:18:24 作者: rapoo

C++的几个边缘问题~~~哪位好心人帮我查一下标准~~
现在手头没有标准文档,谁帮我查一下有关以下几个问题的标准定义..先谢过了!!!

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> .不知道有什么解决办法.
当然,对于编译器来说,要分辨出这些情况,是很简单的事.但我不记得标准对这种东西有没有什么说法了.

[解决办法]
第一问,无解。不要让它们同名(或者说类型完全相同)。
第二问,template < template <typename> class _T >
class A{
};
template <typename _T> class B;
typedef A <B> BaseType;
template < typename _T >
class B : public BaseType {
};
[解决办法]
C;
void f()
{
// 如果要使用A的f
A::f();
// 如果要使用B的f
B::f();
}

[解决办法]
1 歧义了
[解决办法]
问题1
C++的语法中没有提供你所需要的这种选择性覆盖,其实从设计角度出发比较好的解决方案时,让A和B中的函数f都成为纯虚函数这样就不用考虑究竟覆盖那个的问题了:)

读书人网 >C++

热点推荐