2010-03-25 51 views
-2

調用在派生類中定義但在基類中不存在的虛函數時出錯?爲什麼這個錯誤當我有指向派生類的指針?調用虛函數時出錯

#include<iostream.h> 

class A{ 
public: 
virtual void fun() 
{cout<<"A::fun()"; 
} 
}; 

class B : public A 
{ 
public: 

virtual void fun() 
{cout<<"B::fun()"; 
} 
virtual void func() 
{cout<<"B::func"; 
} 
}; 

int main() 
{ 
A *obj1=new B; 
obj1->fun(); 
obj1->func(); 
} 
+1

是的,這是一個錯誤 - 我的編譯器說「 'A類'沒有名爲'func'的成員「您的問題是什麼? – 2010-03-25 09:44:17

+0

爲什麼會出現這個錯誤。我有指向派生類的指針,那麼爲什麼這個錯誤? – sandeep 2010-03-25 09:44:51

+0

你的指針不是指向派生類,而是指向基類。它被定義爲A *。使用指向派生類的指針初始化的事實不會改變! – mmmmmmmm 2010-03-25 13:49:47

回答

3

這是一個錯誤,因爲雖然你在運行時有一個指針指向一個派生類,在編譯時(當它發出錯誤消息)編譯器不知道這一點 - 它只是知道你有一個指針到基類,而基類沒有這個功能。所以你必須在基礎中聲明這個函數是虛擬的,以便編譯器知道你在說什麼。

而BTW,其<iostream>而不是<iostream.h>

+0

謝謝尼爾......非常好的解釋。至少現在,這對我來說是天作之合。 – sandeep 2010-03-25 09:57:52

7

這是我在SO上看到的最不友好的問題。

當然,你得到的錯誤(我打電話給obj1->func()),因爲你的變量是指向A類型的對象,而不是B。所以即使你創建了B,你的變量就像是A,因爲編譯器不知道它實際上是保存在B中的。

你需要改變你的變量指向一個BB* obj1 = new B;

,或者您需要您的指針轉換爲B你打電話func前:((B*)obj1)->func();