你好。一般来说,我想让对象可以在“链”中调用函数,即像这样:
window1.SetTitle("My Program")
->SetSize({ 640,480 })
->SetPosition({ 100,100 })
->SetClosesProgram(true)
->Show();
为此,在每个函数中,我返回一个指向当前对象的指针(即 I do return this)。
一切都会好起来的,但现在是继承的时候了。我有一个抽象类Control,有一个完全虚拟的方法和一组基本方法(例如SetText其他方法),所有这些方法看起来像这样:
Control* Control::SetSomething(int something)
{
//Тут оснвной код метода
return this;
}
但事实是,其他类将继承自该类(例如Label、Button等TextBox),而它们可能具有其他一些不在基类中的方法。当一个对象被创建时,例如一个类Label(继承自一个抽象类Control),那么所有这些将被继承的基本方法Control都会给出一个类型指针Control*,而不是任何方式Label*,这将不允许“链呼吁”全面落实。然后有必要将所有这些基本方法虚拟化,并在每个继承者中重新定义它们,但这会使继承变得毫无意义。
问题:是否可以在 C++ 中实现类似的东西?也许还有其他一些方法?也许是某种对运算符的虚拟重新定义的技巧?我想知道如何正确地做到这一点。先感谢您。
因此,非常感谢 VTT 和其他人的提示和建议。结果,我发现,也许有点变态,但整个解决方案。老实说,我不知道它在“代码正确性”和效率方面有多好,如果您在其中看到令人震惊的地方,我会很高兴批评和其他答案,但本质是这样的:
我制作基类(是抽象的)模板,模板中传入继承人的类名,构造函数的参数之一是指向继承人对象的指针。它看起来像这样:
根据设计,所有控件都继承了基本方法,如下所示:
接下来,我像这样声明后代类:
在 .cpp 中,我编写了类似构造函数的实现:
最终:
我可以链式调用后代对象的函数,从基类继承的函数,以这种方式调用,返回一个指向后代对象的指针。现在不必为每个新的派生类重新定义这些方法,以便它们返回正确的指针。我不知道这是否是正确的方法,是否值得,从 C / C ++ 充分开发的角度来看,担心某种“链式调用”,但这个有效...