2011-03-31 37 views
0

派生功能我有以下情況C++想調用從基類

class base 
{ 
public: 

    virtual void Accepted(SOCKET s) //// Event 
    { 

    } 
    void Listner() 
    { 
      SOCKET acpted; 
      Accepted(acpted); /// When I call I want derived class's Accepted() to get called 

    } 

}; 


class derived 
{ 
    virtual void Accepted(SOCKET s) //// Event 
    { 
     ////// HERE i will write actual implementation (QUESTION) 
    } 

} 

我想打電話給派生類的功能。這將在這裏像事件一樣工作。我想通知派生類在基類中發生了什麼。

+0

的朋友,這是有點急。目前我做了純粹的虛擬,但這不是正確的事情在這裏。我希望允許基類可被調用 – Vijay 2011-03-31 10:50:31

+0

後*真*代碼。 – Erik 2011-03-31 10:51:06

+0

這是事件像機制。任何其他替代方案也適用於我 – Vijay 2011-03-31 10:51:35

回答

6

class derived : public base將使derived實際上繼承自base。然後你的虛擬函數調用將按預期工作。

請注意,你不能在構造函數或析構base這樣的虛函數調用 - 當時base的構造函數被調用時,derived部分尚不存在。在調用析構函數base時,derived部分已被破壞。

編輯:演示,以迴應評論。

class base 
{ 
public: 
    virtual void Accepted(SOCKET s) //// Event 
    { 
     cout << "base::Accepted" << endl; 
    } 
    void Listner() 
    { 
     SOCKET acpted = 0; 
     Accepted(acpted); /// When I call I want derived class's Accepted() to get called 
    } 
}; 


class derived : public base 
{ 
    virtual void Accepted(SOCKET s) //// Event 
    { 
     cout << "derived::Accepted" << endl; 
    } 
}; 


int main(int argc, char * argv[]) 
{ 
    derived d; 
    d.Listner(); 
} 

這將打印derived::Accepted

+0

試過了,不適用於VS2010 – Vijay 2011-03-31 10:46:18

+0

@Vijay:告訴我們實際的代碼。你是否記得使基類函數爲虛擬? – Erik 2011-03-31 10:47:23

+0

是的,請參閱代碼。它的虛擬 – Vijay 2011-03-31 10:55:01

0

除了使擴展基類去derived class(派生:公共基礎),你也可以聲明你的純虛基類接受的方法:

virtual void Accepted(SOCKET s) = 0; 

這種方式派生類被迫執行接受的方法。

而且派生類中的Accepted方法不需要是虛擬的。

+0

如果我聲明爲純虛擬,那麼我不能創建基類的對象。在我的情況下,我想允許創建基類的對象。 – Vijay 2011-03-31 10:45:34

+0

@Vijay:好的..你是對的..我不知道 – Heisenbug 2011-03-31 10:46:22

0

在您的代碼中進行以下更改。 1)派生類:public base 2)創建派生類對象並調用Listener函數。 (如果要創建基類對象,它將無法工作)

DHIRAJ

-2

感謝朋友對你的答案。所有技術上都是正確的。 我按照以下方法解決了這個問題

我想通過不使任何方法成爲純虛擬方法來創建類庫的對象。

如果我將任何方法作爲純虛擬方法,那麼它會使類的基類成爲抽象類。

所以我創建了另一個抽象類,其中所有必需的方法都是純虛擬的,我從中派生出類的基礎。這樣它就允許我創建基地的對象。

例如

class __base__ 
{ 
public: 
    virtual void Accepted(SOCKET s) = 0 //// Event  
    {  
    }  

}; 

class base : public __base__ 
{ 
    public:  
     virtual void Accepted(SOCKET s) //// Event  
     {  
}  
void Listner()  
{   
    SOCKET acpted;   
    Accepted(acpted); /// When I call I want derived class's Accepted() to get called  
} 
}; 

class derived : public base 
{  
    virtual void Accepted(SOCKET s) //// Event  
    {   
     ////// HERE i will write actual implementation (QUESTION)  
    } 
} 
+1

[請不要在你的標識符中使用雙下劃線('__')](http://stackoverflow.com/questions/228783/what -are最規則約-使用-AN-下劃線在-AC-標識符); 'derived'仍然不會從'base'繼承;你沒有使'Accepted'純虛擬; '__base__'沒用。爲什麼你不使用(正確的)代碼,我們有些人花時間爲你寫信而不是寫錯誤的代碼? – 2011-03-31 12:25:26

2

這是按照你想要的方式工作的。如果你的實際代碼不起作用,那麼你沒有向我們展示所有相關的東西。這就是爲什麼我們懇請您向我們展示真實的代碼。你是否認爲你是唯一一個處理無法在互聯網上共享的大型代碼庫的人?你如何看待我們其他人獲得幫助?寫一個實際複製你看到併發布的行爲的小例子。不要發佈你甚至沒有編譯過的psudocode。

這裏是你如何做你想做的事,也是你應該如何張貼的例子。

#include <iostream> 
using namespace std; 

class Base 
{ 
public: 
    virtual void Accepted() 
    { 
     cout << "Base::Accepted" << endl; 
    } 
    void Listener() 
    { 
     cout << "Base::Listener" << endl; 
     Accepted(); 
    } 
}; 

class Der : public Base 
{ 
public: 
    void Accepted() 
    { 
     cout << "Derived::Accepted" << endl; 
    } 
}; 

int main() 
{ 
    cout << "*** BASE ***" << endl; 
    Base b; 
    b.Listener(); 

    cout << "\n*** DERIVED ***" << endl; 
    Der d; 
    d.Listener(); 
} 

輸出是:

*** BASE *** 
Base::Listener 
Base::Accepted 

*** DERIVED *** 
Base::Listener 
Derived::Accepted