4
好吧,我正在使用虛函數,重載函數和多重繼承。當然這並不好。虛擬函數重定義隱藏其他重載函數的相同名稱從另一個基類
該場景:類base1
有一個虛擬功能,需要由其子進程指定。 類derived
派生自兩個父母base1
和base2
,並應使用base2
的現有功能來定義base1
的虛擬功能。
這是好的,但當然很尷尬。動機是我不能改變類base2
,並且已經大量投入的現有接口具有base1
和base2
同名的類函數。這沒關係,在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;
}
如果這不能在現有的演示文稿中修復,有人可以建議不同的對象繼承模型來解決我的問題嗎?
是啊。這對我有用。謝謝謝謝。 – NoahR 2010-09-16 00:49:45