2009-12-10 122 views
1

在C++程序:純虛函數

   #include<iostream.h> 
       class A 
       { 
        public: virtual void func()=0; 
       }; 
       class B:public A 
       { 
        public: void show() 
          { 
            func(); 
          } 
       }; 
       void B::func() 
       { 
         cout<<"In B"<<endl; 
       } 
       int main() 
       { 
        B b; 
        b.show(); 
       } 

如果虛擬函數,FUNC()被B類的主體內重新定義,沒有錯誤。但是,當使用範圍解析運算符時,編譯器會引發錯誤。 這是爲什麼?

+1

不這樣做你的問題,但標準的頭爲,是不是也可以用 2009-12-10 10:24:54

+1

iostream.h舊式標準至極雖然 不建議 – 2009-12-10 12:10:48

回答

13

這是沒有直接關係的func是虛擬的,你總是需要聲明它的類:

class B:public A 
{ 
    public: void show() 
    { 
     func(); 
    } 

    void func(); // add this 
}; 

void B::func() 
{ 
    cout<<"In B"<<endl; 
} 
+3

否則它不會知道B定義了func,並且會嘗試在A中使用純虛擬版本,因爲它是純虛擬的,所以它不能使用純虛擬版本 – Xetius 2009-12-10 10:22:43

+0

@ Xetius:Please;如果您不知道,請在回答之前嘗試編譯測試代碼。如果在B中沒有定義'func',那麼show()將使用A中的版本。這是絕對好的。因爲在運行時它會調用屬於當前實例的派生版本。如果B沒有定義'func',那麼它是一個抽象類,你將不能實例化一個B的實例。 – 2009-12-10 16:37:28

4

你必須聲明你重新定義B類成員函數func()

class B:public A 
{ 
    virtual void func(); 
public: 
    void show() {func(); } 
}; 
直接