有这样一段代码:注意 base 的定义!
1 #include <iostream>
2
3 using namespace std;
4
5 class Base
6 {
7 public:
8 typedef Base base;
9 void f()
10 {
11 cout<<"Base::f()"<<endl;
12 }
13 };
14
15 class A
16 {
17 public:
18 typedef A base;
19 void f()
20 {
21 cout<<"A::f()"<<endl;
22 }
23 };
24
25 class B
26 : public A
27 , public Base
28 {
29 public:
30 B()
31 {
32 base::f();
33 }
34 };
35
36 void main()
37 {
38 B b;
39 }
应该输出什么呢? 答案是
: A::f()
如果把B的定义修改一下呢:
1 class B
2 : public Base
3 , public A
4 {
5 public:
6 B()
7 {
8 base::f();
9 }
10 };
答案就是:Base::f()当然按理说应该编译错误了,因为base这个符号已经在B里面ambiguous了。但是没有任何错误,任何警告。
而且base的定义和基类的声明顺序是相关的,注意观察修改前和修改后B的定义。
所以,在使用多重继承的时候,一定要注意基类中typedef的类型,因为它们是不可靠的,而且编译器也不会提醒你。它是和声明顺序相关的。不知道是不是我的C++编译器的bug。
我试过VS2005 和 VS2008
谢谢 的意见,是我措辞不当。
谢谢Sandy
指出public的位置问题。
posted on 2009-04-09 23:40
尹东斐 阅读(1871)
评论(13) 编辑 收藏 引用