2012-08-24 116 views
1

一個方法,如果我有這個類:覆蓋在C++類

class FooBar { 
    public: 
     FooBar(int qux); 
     void bar(); 

     void foo1(); 
     void foo2(); 
     //... 
     void foo99(); 
} 

我如何可以覆蓋在FooBarbar方法,同時仍然能夠使用所有其他foo方法,無需重新定義它們?

編輯:

我想用這樣的:

FooBar2 baz(1); // call the constructor of FooBar, FooBar(1) 
baz.foo1(); //call method foo1 of original FooBar 
baz.bar(); // call method bar of FooBar2 

我寧願不編輯Foobar的頁眉或執行。

是否有可能使構造函數調用原始構造函數FooBar

+0

這是很多foos。 – chris

+0

你的意思是重寫,還是重載? – juanchopanza

+1

你可以更具描述性 - 你究竟想要什麼?提供真實的環境; 'foo'和'bar'沒有意義。 – tenfour

回答

2

您製作barvirtual,因爲重寫只適用於virtual方法。

然後您擴展FooBar併爲bar提供新的實現。

class FooBar { 
    public: 
     virtual void bar(); 

     void foo1(); 
     void foo2(); 
     //... 
     void foo99(); 
}; 

class FooBarDerived : FooBar 
{ 
    public: 
     void bar(); 
}; 
1

你需要的是功能隱藏,而不是overridding
僅當涉及到關鍵字virtual時,Overidding才適用。

只是重新定義你想在派生類中重載的方法,你應該沒問題。

class YourClass: public FooBar 
{ 
    public: 
     void bar(){} 
}; 

YourClass對象可以訪問FooBar所有的方法,因爲這些都是public方法和類從中派生公開,而YourClass::bar()隱藏FooBar::bar()

編輯:
你編輯的問題講清楚功能隱藏確實是你所需要的。
這是隱藏功能的online demo達到您的要求。

是否也可以使構造函數從FooBar調用原始的構造函數?

可以使用成員初始化列表調用通過派生類的構造適當的基類構造函數。

良好閱讀:
What is this weird colon-member (" : ") syntax in the constructor?

+0

@LuchianGrigore:那是真的。 –

+1

從問題中不清楚他真的想要什麼。 – tenfour

+0

@tenfour:*「我怎樣才能覆蓋'FooBar'中的bar方法,同時仍然能夠使用所有其他'foo'方法而不需要再次定義它們?」*對我來說似乎很清楚/直觀。 –

2

繼承。

class FooBar 
{ 
public: 
    virtual void bar() { ... default implementation ... } 
    void foo1(); 
    void foo99(); 
} 


class FooBarVariation : public FooBar 
{ 
public: 
    virtual void bar() { ... different implementation ... } 
} 

FooBarVariation會像一個FooBar,但有不同的實施bar()