背景:我有Qt生成的沒有共同祖先的UI類。我使用這些UI類之一繼承一個類(比如說「Door」),而派生類(「OakDoor」)將使用不同的UI類,儘管大多數UI元素將具有相同的名稱。如何覆蓋基類的( - >)運算符的成員
到現在爲止,我一直在隱藏基類UI類(即派生類使用不同類型但同名的UI類),但現在需要依靠繼承來處理基類在UI上工作的情況班;在這種情況下隱藏不起作用。
我已經問過使用繼承來做到這一點的方法,並指出了使用組合的方向。所以我試圖找到一種有效的方法來做到這一點,而無需爲每個UI元素定義訪問函數。這不是真正的組合,但我認爲它讓我接近一點努力。
class form_container
{
public:
form_container(){};
form_container(Ui_A_Form * form){_form = form;}
~form_container(){ delete _form; }
Ui_A_Form *_form;
Ui_A_Form & operator->()
{
return *_form;
}
};
當時的想法是再有門使用這個類和OakDoor它的一個子類:
class B_form_container : public form_container
{
public:
B_form_container(Ui_B_Form * form){_form=form;}
~B_form_container(){delete _form;}
Ui_B_Form *_form;
Ui_B_Form & operator->()
{
return *_form;
}
};
所以我真的只是轉移藏匿。無論如何,這個問題似乎與我的操作符重載 - >()。 在我的Door課上,我有 form_container *_myform
; 它正是如此構造:
_myform = new form_container(new A_Form());
但是當我嘗試在A_Form訪問任何它不會編譯,比如Qt的SetupUI功能:
_myform-> setupUi(_a_widget);
我明顯在做錯事。將不勝感激任何幫助 - 非常感謝! (我可以看到問題,當子類試圖刪除_form在基類,但我會稍後排序)
編輯:好吧這是編譯現在(非常感謝@(R Sahu)),但我沒有看到我期望的超載。例如:
class base_class()
{
form_container *_myform;
};
class derived_class(): public base_class()
{
//inherit _myform;
};
//(constructor for derived class)
derived_class()::derived_class()
{
_myform = new B_form_container(new B_form());
(*_myform)->setupUI(new QWidget()); // tries to setupUi on an A_form
}
這是調用form_container :: operator - >(),大概是因爲它不是虛擬的。如果我在基類form_container中將其虛擬化,則派生類B_form_container會對函數的區別僅在於返回類型。 有沒有辦法解決這個問題? 我能爲實例做這樣的事情:
class base : public A_form
{
virtual base * operator->()
{
// not sure how to return ->() operator of A_form
return A_form::operator->(); // ???
}
};
class derived : public base, public B_form
{
virtual base *operator->()
{
return B_form::operator->(); // again???
}
} ;
另一個編輯:我不認爲我所試圖做的是可能的了。如果你能糾正我,請做。在此期間,我寫了一些東西來處理moc輸出,並創建具有訪問功能的類,我可以用覆蓋。
請提供[最小,完整,可驗證示例](http://www.stackoverflow.com/help/mcve)。 – Barry
看起來你嘗試的越多,意義越小......如果'derived'從'base'派生,那麼它間接地從'A_form'派生。因此派生出'A_form'或'B_form'。 – Phil1970