在从模板化中介派生的类中调用非模板基类构造函数
Calling non-template base class constructor in class derived from templated intermediary
template <class WndClass>
class screenhelpers : public WndClass
{
public:
typedef WndClass BaseClass;
typedef typename screenhelpers<WndClass> ThisClass;
CRect GetControlRect(CWnd *pControl) const
{
CRect rectWindow(0,0,0,0);
if (!pControl)
return rectWindow;
pControl->GetWindowRect(&rectWindow);
this->ScreenToClient(&rectWindow);
return rectWindow;
}
};
class MyDialog : public screenhelpers<CDialog>
{
public:
typedef screenhelpers<CDialog>::BaseClass MDialog;
MyDialog(int i);
MyDialog(LPCSTR lpszTemplateName, CWnd *pParentWnd);
MyDialog(int nIDTemplate, CWnd *pParentWnd);
};
MyDialog::MyDialog(int i)
{
BaseClass b;
}
MyDialog::MyDialog(LPCSTR lpszTemplateName, CWnd *pParentWnd)
: MyDialog::BaseClass(lpszTemplateName, pParentWnd)
{
}
MyDialog::MyDialog(int nIDTemplate, CWnd *pParentWnd)
: MyDialog::CDialog(nIDTemplate, pParentWnd)
{
}
我不明白为什么我不能调用屏幕助手的基类。
如果MyDialog继承自屏幕助手,屏幕助手继承自CDialog,为什么我不能调用CDialog?
构造函数中的初始化列表只能调用其直接父类的构造函数,而不能调用链上的其他构造函数。这就是为什么你不能直接初始化CDialog。
你的屏幕助手类没有定义一个带两个参数的构造函数,所以这也不能工作。即使您添加了这样的构造函数,我也不确定通过类型定义的名称引用它的语法是否有效,您可能需要使用screenhelpers<CDialog>
来代替。
如果允许MyDialog
构造函数调用CDialog
构造函数,则后者将被MyDialog
和screenhelpers
调用两次。那将是一场灾难。
如果你需要控制如何从MyDialog
调用CDialog
构造函数,你需要使用虚拟继承:
template <class WndClass>
class screenhelpers : public virtual WndClass
那么你将有(不只是能够)从MyDialog
调用CDialog
构造函数。
请注意,这可能会对您的设计产生其他影响。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素