2013-06-26 74 views
0

調用函數我有一些代碼,這似乎similair這樣:源自範圍

#include <iostream> 

class Base { 
public: 
    void test() { 
     std::cout << "Base::test()" << std::endl; 
    } 

    void test2() { 
     test(); 
    } 
}; 

class Derived : public Base { 
public: 
    void test() { 
     std::cout << "Derived::test()" << std::endl; 
    } 
}; 

int main() { 
    Derived d; 
    d.test2(); 
    return 0; 
} 

現在這種輸出ofcourse Base::test(),但是我希望它輸出Derived::test()利用虛函數的調用和使用稱爲:Derived::test的函數過載的不同符號。

有人知道這是否有可能實現?

+0

如果我明白你的意思,你想讓d.test2()直接調用d.test(),對嗎?據我所知,沒有虛擬功能就沒有辦法做到這一點。他們的目的正是爲了這種情況。 –

+0

是的,沒有重載'Base :: test2()',對Derived'沒有使用不同的表示法,也不會失去性能(例如虛函數調用)。 – Tim

+0

你允許修改'Base'嗎? –

回答

3

你可以使用所謂的奇異遞歸式模式(CRTP),並Base模板

template<typename D> 
class Base { 
public: 
    void test() { 
     std::cout << "Base::test()" << std::endl; 
    } 

    void test2() { 
     (static_cast<D*>(this))->test(); 
    } 
}; 

然後,你會從Base<Derived>,而不是僅僅Base獲得Derived

class Derived : public Base<Derived> { 
//      ^^^^^^^^^^^^^ 
//      This is the only change required in Derived 
public: 
    void test() { 
     std::cout << "Derived::test()" << std::endl; 
    } 
}; 

這是live example

+0

然後他必須檢查哪一個更快 - 投射或虛函數調用。 –

+0

@KamenStoykov演員可以在構造函數中完成。 @AndyProwl這是一個不錯的解決方案,但我認爲我沒有把'Base'的繼承類型更改爲模板類'Base '。一些派生類已經實現。 – Tim

+0

@Tim:我明白了。然後,我真的不相信除了使用虛擬功能之外,還有別的方法。 –