2013-02-09 52 views
1

請看這段代碼。它只是反映了什麼,我想要做的基本概念:重新定義派生類的繼承內部函數以對基類產生影響

#include <iostream> 
using namespace std; 

class Base 
{ 
public: 
    Base() 
    { 
     /* Some code I want to reuse */ 
     Redefined(); 
    } 
    virtual ~Base() {} 
    void Redefined() { val = 10; } 
    int val; 
}; 

class Derived : public Base 
{ 
public: 
    Derived() : Base() {} 
    ~Derived() {} 
    void Redefined() { val = 25; } 
}; 

int main() 
{ 
    Base* check = new Derived(); 

    cout << check->val << endl; 

    system("pause"); 
    return 0; 
} 

我想check對象val屬性爲25,而不是10

正如你可以看到我有兩個班。類構造函數具有一些複雜的功能,我希望類Derived也具有它的構造函數。如何更改派生函數Redefined以便我不必完全重寫Derived構造函數(實際上只是複製粘貼整個基類構造函數代碼並替換一行代碼 - 更新版本的Redefined函數)?

回答

2

你不能真的用這種方式覆蓋函數。通常情況下,你可以使用虛函數,但是在構造函數中不能以你想要的方式工作。

一個更好的辦法是通過你想要的Base構造函數的值:

class Base 
{ 
public: 
    Base(int init_val = 10) 
    { 
     /* Some code I want to reuse */ 

     val = init_val; 
    } 
    virtual ~Base() {} 

    int val; 
}; 

class Derived : public Base 
{ 
public: 
    Derived() : Base(25) {} 
    ~Derived() {} 

}; 

這樣任何派生類可以自己選擇的值傳遞給基類。

+0

我明白了。但是如果我的函數Redefined'更復雜,例如在我的程序中構建DirectX緩衝區,這就是爲什麼我希望它在Derived'類中表現不同。我最初的例子並不完全正確 - 分配單個整數是我想實現的非常簡化的版本。 – GuardianX 2013-02-09 10:44:53

0

基於以上評論:

我真的認爲正確的解決辦法是有一個「接口」型基類(即與純虛函數的基類,而派生類實際實現正確的行爲),然後讓每個類處理構建自己的DirectX緩衝區。你可能會發現你需要2-3個不同的派生類,它們以不同的方式構造緩衝區,然後從那些真正做實際工作的類派生出來。我希望這是有道理的。

或者,您可以將足夠多的參數傳遞給基類,以便可以構建緩衝區。但我認爲第一個建議是更好的選擇。

相關問題