Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在具有相同父类的两个类之间共享代码? 虽然我使用MFC,但我相信这主要是C++问题。_C++_Oop_Mfc_Polymorphism - Fatal编程技术网

如何在具有相同父类的两个类之间共享代码? 虽然我使用MFC,但我相信这主要是C++问题。

如何在具有相同父类的两个类之间共享代码? 虽然我使用MFC,但我相信这主要是C++问题。,c++,oop,mfc,polymorphism,C++,Oop,Mfc,Polymorphism,我有CResizingDialog派生自CDialog,它是应用程序中所有对话框的基类。它使他们能够根据目标屏幕大小自动(你猜到了)调整大小。CResizingDialog通过覆盖CDialog的几个虚拟函数来实现这一点,包括OnSize(),OnInitDialog(),OnPaint()。到目前为止一切顺利 现在我正在添加一个属性页/页,它也需要相同的大小调整功能,但是我不能将CResizingDialog用作我的属性页的基类。这意味着我需要一个新的基类,比如从CPropertyPage派生

我有
CResizingDialog
派生自
CDialog
,它是应用程序中所有对话框的基类。它使他们能够根据目标屏幕大小自动(你猜到了)调整大小。CResizingDialog通过覆盖CDialog的几个虚拟函数来实现这一点,包括
OnSize()
OnInitDialog()
OnPaint()
。到目前为止一切顺利

现在我正在添加一个属性页/页,它也需要相同的大小调整功能,但是我不能将CResizingDialog用作我的属性页的基类。这意味着我需要一个新的基类,比如从
CPropertyPage
派生的CResizingPage,它将包含与CResizingDialog相同的功能


但是,调整对话框及其控件大小的代码完全相同。有没有一种方法可以以某种方式重用CResizingDialog?我从未使用过多重继承,这有帮助吗?

我有两个建议如何解决这个问题,你必须决定哪一个更容易/更适合你的情况

如果可能,您可以将调整大小的代码移动到具有适当参数的独立函数中,这些参数可以从2个虚拟函数中调用

另一种方法是使基类成为模板。大概是这样的:

template< typename Base >
CResizingBase
    : public Base
{
    // override the appropriate functions here
};

class CResizingDialog
    : public CResizingBase< CDialog >
{
};

class CResizingPage
    : public CResizingBase< CPropertyPage >
{
};
模板
水芹基
:公共基地
{
//在此处重写相应的函数
};
类CResizingDialog
:public CResizingBase
{
};
类CResizingPage
:public CResizingBase
{
};

如果要重复使用调整大小代码,必须从
CResizingDialog
中提取调整大小代码,并在对话框/属性页实现中重复使用。多重继承在这里是没有帮助的,主要是因为MFC的管道宏。查看装饰器设计模式。我不喜欢MFC,所以请原谅,如果这只是C++。C++支持多种继承。我有一个我正在使用的系统:想象a类、B类:公共a和C类:公共a。如果B是可调整大小的,C是可聚焦的,你可以创建一个派生的D类:公共B,公共C,它继承了B和C。为什么不继承可调整大小?@Nick谢谢,我想知道在这里是否有任何设计模式会有所帮助,我会跟进您的建议。您需要继承接口还是只继承实现?例如,在CResizingDialog中是否有一些在层次结构之外使用的公共方法?如果没有,您可以使用委托(例如,引入一个提供必要逻辑的类成员)。这似乎很有希望,但有一个诀窍是我有CDialog>>CResizingDialog>>CMyDialog。但这在哪里适合属性页呢?CDialog>>CPropertypage>>??>>我从来没有使用过MFC,所以我不熟悉类结构。但是CDialog>>CpPropertyPage>>CResizingPage>>CMyPage难道不起作用吗?这是唯一合乎逻辑的方法,尽管我也在考虑CDialog>>CResizingDialog,但CpPropertyPage是一个库类,我不能更改它的基类。看来值得一试。实际上,我也必须对CPropertySheet做同样的事情,它是从CWnd派生的。这是一个好主意,但我认为它不会起作用。
CResizingBase
必须初始化
CDialog
CPropertyPage
,以其派生的为准。现在这两个都有不同的构造器,我认为这是一个交易破坏者。它必须将正确的内容传递给成员初始化列表中的基类,这在这种情况下是不可能的。您可以使
CResizingBase
的构造函数成为一个完美的转发器。它接受可变模板参数并将它们转发给基类。我没有太多使用可变模板,所以我可能会有点错误,但我认为代码应该是这样的<代码>模板
{
公共:
模板
(args)
<