2010-09-16 24 views
4

好吧,我正在使用虛函數,重載函數和多重繼承。當然這並不好。虛擬函數重定義隱藏其他重載函數的相同名稱從另一個基類

該場景:類base1有一個虛擬功能,需要由其子進程指定。 類derived派生自兩個父母base1base2,並應使用base2的現有功能來定義base1的虛擬功能。

這是好的,但當然很尷尬。動機是我不能改變類base2,並且已經大量投入的現有接口具有base1base2同名的類函數。這沒關係,在base1中沒有實現,它應該只是重定向到base2

我的問題出現了,因爲base2有幾個與所討論的虛擬函數同名的重載函數。所有其他重載版本在編譯時基本隱藏起來。

這是一個小的演示代碼。

// this version does not compile, overloaded samenameFunc(int, int) cannot be found in the derived class. 
#include <iostream> 
using namespace std; 

class base1 { 
public: 
    virtual void samenameFunc(int scratch) { cout << "from base1: " << scratch << std::endl; } 
}; 

class base2 { 
public: 
    void samenameFunc(int scratch) { cout << "samenameFunc from base2: " << scratch << std::endl; } 
    void samenameFunc(int scratch, int foo) { cout << "samenameFunc(2 args) from base2: " << scratch << ", " << foo << std::endl; } 
}; 

class derived : public base1, public base2 { 
public: 
    void samenameFunc(int scratch) { base2::samenameFunc(scratch); }// { cout << "from derived: " << scratch << std::endl; } 
}; 

int main() 
{ 
    derived d; 

    d.samenameFunc(66); 
    d.samenameFunc(77, 88); 
    return 0; 
} 

,編譯器錯誤:

$ g++ inheritance_overload_tester.cc 
inheritance_overload_tester.cc: In function ‘int main()’: 
inheritance_overload_tester.cc:26: error: no matching function for call to ‘derived::samenameFunc(int, int)’ 
inheritance_overload_tester.cc:18: note: candidates are: virtual void derived::samenameFunc(int) 

如果超載samenameFunc(int, int)被重命名,我可以編譯和功能如預期。但請記住,我實際上不能改變base2。

// this version does compile 
#include <iostream> 
using namespace std; 

class base1 { 
public: 
    virtual void samenameFunc(int scratch) { cout << "from base1: " << scratch << std::endl; } 
}; 

class base2 { 
public: 
    void samenameFunc(int scratch) { cout << "samenameFunc from base2: " << scratch << std::endl; } 
    void anotherFunc(int scratch, int foo) { cout << "anotherFunc(2 args) from base2: " << scratch << ", " << foo << std::endl; } 
}; 

class derived : public base1, public base2 { 
public: 
    void samenameFunc(int scratch) { base2::samenameFunc(scratch); }// { cout << "from derived: " << scratch << std::endl; } 
}; 

int main() 
{ 
    derived d; 

    d.samenameFunc(66); 
    d.anotherFunc(77, 88); 
    return 0; 
} 

如果這不能在現有的演示文稿中修復,有人可以建議不同的對象繼承模型來解決我的問題嗎?

回答

5

derived類的定義,你可以添加一個using聲明從base2可見使功能:

using base2::samenameFunc; 
+0

是啊。這對我有用。謝謝謝謝。 – NoahR 2010-09-16 00:49:45

相關問題