有這樣一段代碼:注意 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
尹東斐 閱讀(1879)
評論(13) 編輯 收藏 引用