背景:我有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