2017-08-25 84 views
-1

我有一個基類多態性與第3級的繼承基類的shared_ptr

class Base { 
    public: 
    virtual void func() = 0; 
} 

我有一個具體的派生類

class Derived : public Base { 
    public: 
    void func() {func2();} 
    void func2() {}; 
} 

最後,我有一個派生類

class DerivedDerived : public Derived { 
     // inherits func() from Derived 
     void func2() {} //Overrides func2() from Derived 
} 
void g(shared_ptr<Base> s) { 
    s->func(); 
} 

現在,我的問題是這樣的:我有一個函數g(),需要一個shared_ptr <基地>並且調用func()而沒有任何類型轉換,因爲它不知道任何子類。 現在,如果我做的:

shared_ptr<Base> s1 = make_shared<Derived>(); 
shared_ptr<Base> s2 = make_shared<DerivedDerived>(); 
g(s1); //func() of Derived Class called 
g(s2); //func2() of Derived Class called inside, func2() of DerivedDerived Class needed to be called inside. 

我想正確的類的FUNC()調用FUNC2(),我..

+0

什麼是問題?沒有調用正確的函數嗎?你有構建錯誤嗎?崩潰?意外的結果?請詳細說明。你有*試過嗎?也許你甚至有一個[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve),你可以告訴我們? –

+2

也讓'Derived :: func2()''virtual'。 – songyuanyao

+2

*「void func2(){} //覆蓋派生」*「中的func2()。不,你只是**隱藏**因爲func2不是'虛擬的'。 – Jarod42

回答

0

OK,因爲你已經改變了代碼 - 我更新結果,正如Jarod42所提到的 - 你隱藏了func2而不是覆蓋它。我還按照AlexanderS的建議添加了override關鍵字。

#include <iostream> 
#include <memory> 

class Base { 
public: 
    virtual void func() = 0; 
}; 

class Derived : public Base { 
public: 
void func() override {func2();} 
virtual void func2() {std::cout << "func2: Derived\n";}; 
} 
; 

class DerivedDerived : public Derived { 
public: 
    void func2() override {std::cout << "func2: DerivedDerived\n";} //Overrides func() from Derived 
}; 
void g(std::shared_ptr<Base> s) { 
    s->func(); 
} 

int main() 
{ 
    std::shared_ptr<Base> s1 = std::make_shared<Derived>(); 
    std::shared_ptr<Base> s2 = std::make_shared<DerivedDerived>(); 
    g(s1); //func() of Derived Class called 
    g(s2); //func() of Derived Class called, func() of DerivedDerived Class needed to 
    return 0; 
} 

/*************** 
Output: 
$ ./test 
func2: Derived 
func2: DerivedDerived 
***************/ 

/* Compiler error when override is used and func2 is not marked virtual 
    src/test.cpp:19:16: error: ‘void DerivedDerived::func2()’ marked ‘override’, but does not override 
     void func2() override {std::cout << "func2: DerivedDerived\n";} //Overrides func() from Derived 
*/ 
1

作爲除了本主題,因爲C++ 11存在override關鍵字,至極防止這些類型的錯誤。當你使用它時,如果你不覆蓋你使用關鍵字的方法,它會拋出一個編譯器錯誤。

class DerivedDerived : public Derived { 
     void func2() {} override; // would throw an error in your case 
}