2013-05-21 66 views
0

的代碼片段下面是從我的Keyboard.hKeyboard.cpp。我的問題是,我將如何實現分層的父母和孩子的關係?因此,如果孩子沒有實施任何虛擬成員,父母可以自由地這樣做。作爲一個例子,孩子實現了KeyboardDepressA,但沒有實現KeyboardDepressB,讓父母實現了KeyboardDepressB的捕獲。同時父母和孩子都是不同類型的課程,什麼不可以的......虛擬父子關係

我不想讓孩子知道父母對Device::Keyboard支持;因此,我想使用get實例調用父級,如KeyboardDepressB中所示。爲了使這項工作,我需要到父分配給static實例本身,而是static劑量沒有爲關鍵字this支持。所以我該怎麼做?

我不停的代碼到最低限度。如果需要更多,請隨時詢問。 ^^

class Keyboard 
{ 

private: 

    Keyboard(); 
    ~Keyboard(); 

public: 

    static Device::Keyboard& Instance(); 
    static void SetParent(Device::Keyboard *cpParent); 

    virtual void KeyboardDepressA (); 
    virtual void KeyboardReleaseA (); 

    virtual void KeyboardDepressB (); 
    virtual void KeyboardReleaseB (); 

    … … ... 
}; 


Device::Keyboard& 
Keyboard::Instance() 
{ 

    static Device::Keyboard nrKeyboard; 
    return nrKeyboard; 

} // member 

void 
Keyboard::SetParent(Device::Keyboard *cpParent) 
{ 

    Device::Keyboard& nrParent(Keyboard::Instance()); 
    *this = cpParent; 

} // member 

void 
Keyboard::KeyboardDepressA() 
{ 

    Device::Keyboard& nrParent(Keyboard::Instance()); 
    nrParent.KeyboardDepressA(); 

} // member 

void 
Keyboard::KeyboardReleaseA() 
{ 

    Device::Keyboard& nrParent(Keyboard::Instance()); 
    nrParent.KeyboardReleaseA(); 

} // member 

void 
Keyboard::KeyboardDepressB() 
{ 

    Device::Keyboard& nrParent(Keyboard::Instance()); 
    nrParent.KeyboardDepressB(); 

} // member 

void 
Keyboard::KeyboardReleaseB() 
{ 

    Device::Keyboard& nrParent(Keyboard::Instance()); 
    nrParent.KeyboardReleaseB(); 

} // member 
+0

單類通常使它們的構造函數/析構函數私人 – cppguy

+0

TY。我知道...這仍然是在進行中..如果我選擇使用實例設計,我將不得不使它成爲單身。 ^^ –

回答

1

所以,總的來說它的複雜與單模式混合繼承,以便謹慎那裏。

如果你有父子關係,在C++中母公司和/或孩子能實現虛擬功能。

如果您希望父來實現它,而不是孩子:宣佈它在父虛擬和落實父,但不聲明或如果你想父母實現它爲孩子

class parent 
{ 
public: 
    virtual void func(); 
} 
void parent::func(){ ... } 
class child : public parent 
{ 
}; 
parent* p = new child; 
p->func(); // calls parent's func 

由子重寫實現:其聲明爲在這兩個父類和子類的虛擬和實現它的兩個類(注意孩子可以調用父類的實現,而不必瞭解執行是什麼)

class parent 
{ 
public: 
    virtual void func(); 
} 
void parent::func(){ ... } 
class child : public parent 
{ 
    virtual void func(); 
}; 
void child::func(){ ... parent::func();} 
parent* p = new child; 
p->func(); // calls child's func 

如果您希望孩子實現它和家長不要:聲明它作爲父純虛成員,並宣佈並執行它爲孩子

class parent 
{ 
public: 
    virtual void func() = 0; 
} 
class child : public parent 
{ 
    virtual void func(); 
}; 
void child::func(){ ... } 
parent* p = new child; 
p->func(); // calls child's func 
+0

哈哈。我沒有想到要繼承父級,因爲你在這裏有'class child:public parent',我太關注委託模式。此外,我可能已經意識到我的問題,因爲我可以做'靜態設備::鍵盤* npKeyboard;''返回npKeyboard;'而不是參考。 –

+0

你在上面做的參考風格是更清潔的imo。如果你打算動態地分配單例,我建議不要使用指針,因爲你必須在某處處理它,在處理單例時總是很麻煩 – cppguy