我有一個類似于這樣的類層次結構:
class Widget {
// a lot of virtual members
};
class Button : public Widget {
// new stuff overrides
};
class MySuperButton : public Button {
// ...
};
而且我想隱藏MySuperButton繼承自Button而不是繼承的事實Widget。基本上從Button私有繼承,同時保持其所有基類公開。
為什么?
我有一個復雜的小部件構建Button,它需要保持其按鈕狀態的一些不變性。暴露它Button可能允許修改按鈕直接破壞這些不變數。
例子:
MySuperButton button;
button.setText("Click me!") // calls Button::setText
// Oh no, MySuperButton set some special text which has now been overriden =(
什么不起作用
私下
MySuperButton繼承Button也隱藏Widget,阻止我Widget用我的按鈕做事。使用訪問說明符不會阻止
MySuperButton轉換為Button. 所以void doButtonStuff(Button& b);會接受一個MySuperButton&就好了。使用合成迫使我重新實作一堆
Button已經重新實作的東西,只是為了轉發它,這是一個 PITA。特別是因為實際的層次結構相當深,而且這些都是大類。虛擬繼承似乎不起作用,因為基礎不可見(但不確定為什么會出現問題)。見神螺栓
我無法修改ButtonorWidget類,因為它們來自外部庫(在本例中為 Qt)。實際代碼也稍微復雜一些,提供的層次結構是為了說明。
有什么辦法可以做到這一點,或者我是否需要接受如果我不小心我的小部件可能會損壞?
uj5u.com熱心網友回復:
你問的是不可能的。
一個可能的 Qt 特定解決方案如下:
class MySuperButton : public Widget {
public:
MySuperButton () {
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button = new Button());
setLayout(layout);
}
private:
Button *button;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/509849.html
標籤:C qt哎呀遗产
上一篇:在QT中執行system()命令時如何避免控制臺閃爍/打開?
下一篇:拖拽時閃退
