Ma question principale est : y a-t-il un moyen pour éviter de redéfinir
GetWindowRect vingt fois, avec vingt fois le même code ? J'ai essayé de
dériver CBaseUI de CWnd, mais alors j'obtiens des tas d'erreurs de
compilation « CTextUI::uneméthode is ambiguous ».
Ma question principale est : y a-t-il un moyen pour éviter de redéfinir
GetWindowRect vingt fois, avec vingt fois le même code ? J'ai essayé de
dériver CBaseUI de CWnd, mais alors j'obtiens des tas d'erreurs de
compilation « CTextUI::uneméthode is ambiguous ».
Ma question principale est : y a-t-il un moyen pour éviter de redéfinir
GetWindowRect vingt fois, avec vingt fois le même code ? J'ai essayé de
dériver CBaseUI de CWnd, mais alors j'obtiens des tas d'erreurs de
compilation « CTextUI::uneméthode is ambiguous ».
Bonjour,
Je reprends un code C++ (sur Windows avec MFC) que je dois étendre. En
particulier je suis tombé sur un truc qui ne me semble pas très propre,
et je voudrais savoir comment l'améliorer.
Il y a une classe de base, mettons CBaseUI, qui est dérivée plusieurs
fois. Chacune des classe dérivées dérive aussi d'une sous-classe du CWnd
des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton, etc., sont
dérivées de CWnd, ce qui fait que les classes dérivées de CBaseUI sont
elles-mêmes dérivées de CWnd -- mais pas CBaseUI elle-même.
Le besoin est, à partir d'un pointeur CBaseUI * pointant vers l'une des
sous-classes, d'appeler la méthode GetWindowRect (définie dans CWnd).
l'implémentation actuelle passe par une fonction virtuelle dans CBaseUI,
définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
Ma question principale est : y a-t-il un moyen pour éviter de redéfinir
GetWindowRect vingt fois, avec vingt fois le même code ? J'ai essayé de
dériver CBaseUI de CWnd, mais alors j'obtiens des tas d'erreurs de
compilation « CTextUI::uneméthode is ambiguous ».
Bonjour,
Je reprends un code C++ (sur Windows avec MFC) que je dois étendre. En
particulier je suis tombé sur un truc qui ne me semble pas très propre,
et je voudrais savoir comment l'améliorer.
Il y a une classe de base, mettons CBaseUI, qui est dérivée plusieurs
fois. Chacune des classe dérivées dérive aussi d'une sous-classe du CWnd
des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton, etc., sont
dérivées de CWnd, ce qui fait que les classes dérivées de CBaseUI sont
elles-mêmes dérivées de CWnd -- mais pas CBaseUI elle-même.
Le besoin est, à partir d'un pointeur CBaseUI * pointant vers l'une des
sous-classes, d'appeler la méthode GetWindowRect (définie dans CWnd).
l'implémentation actuelle passe par une fonction virtuelle dans CBaseUI,
définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
Ma question principale est : y a-t-il un moyen pour éviter de redéfinir
GetWindowRect vingt fois, avec vingt fois le même code ? J'ai essayé de
dériver CBaseUI de CWnd, mais alors j'obtiens des tas d'erreurs de
compilation « CTextUI::uneméthode is ambiguous ».
Bonjour,
Je reprends un code C++ (sur Windows avec MFC) que je dois étendre. En
particulier je suis tombé sur un truc qui ne me semble pas très propre,
et je voudrais savoir comment l'améliorer.
Il y a une classe de base, mettons CBaseUI, qui est dérivée plusieurs
fois. Chacune des classe dérivées dérive aussi d'une sous-classe du CWnd
des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton, etc., sont
dérivées de CWnd, ce qui fait que les classes dérivées de CBaseUI sont
elles-mêmes dérivées de CWnd -- mais pas CBaseUI elle-même.
Le besoin est, à partir d'un pointeur CBaseUI * pointant vers l'une des
sous-classes, d'appeler la méthode GetWindowRect (définie dans CWnd).
l'implémentation actuelle passe par une fonction virtuelle dans CBaseUI,
définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
Ma question principale est : y a-t-il un moyen pour éviter de redéfinir
GetWindowRect vingt fois, avec vingt fois le même code ? J'ai essayé de
dériver CBaseUI de CWnd, mais alors j'obtiens des tas d'erreurs de
compilation « CTextUI::uneméthode is ambiguous ».
Il est probable que le problème soit résolu par un héritage virtuel.
[...]
Malheureusement, il faudrait pour que cela fonctionne que CEdit (et les
autres) héritent virtuellement de CWnd, ce qui n'est probablement pas le
cas. Si jamais c'est le cas, cela pourrait résoudre votre problème.
Si ce n'est pas le cas, alors dériver deux fois d'une même classe n'est
pas une bonne idée : cela voudrait dire qu'un objet CTextUI (par
exemple) serait à la fois une CWnd et une autre CWnd, ce qui n'est
probablement pas la sémantique que vous désiriez.
Il est probable que le problème soit résolu par un héritage virtuel.
[...]
Malheureusement, il faudrait pour que cela fonctionne que CEdit (et les
autres) héritent virtuellement de CWnd, ce qui n'est probablement pas le
cas. Si jamais c'est le cas, cela pourrait résoudre votre problème.
Si ce n'est pas le cas, alors dériver deux fois d'une même classe n'est
pas une bonne idée : cela voudrait dire qu'un objet CTextUI (par
exemple) serait à la fois une CWnd et une autre CWnd, ce qui n'est
probablement pas la sémantique que vous désiriez.
Il est probable que le problème soit résolu par un héritage virtuel.
[...]
Malheureusement, il faudrait pour que cela fonctionne que CEdit (et les
autres) héritent virtuellement de CWnd, ce qui n'est probablement pas le
cas. Si jamais c'est le cas, cela pourrait résoudre votre problème.
Si ce n'est pas le cas, alors dériver deux fois d'une même classe n'est
pas une bonne idée : cela voudrait dire qu'un objet CTextUI (par
exemple) serait à la fois une CWnd et une autre CWnd, ce qui n'est
probablement pas la sémantique que vous désiriez.
Je ne commenterai pas sur la structure initiale,
CBaseUI::GetWindowRect(CRect* rect) {
dynamic_cast<CWnd&>(*this).GetWindowRect(rect);
}
dynamic_cast<CWnd&> plutot que dynamic_cast<CWnd*> pour avoir une
exception plutot que dereferencer un pointeur nul si la classe la plus
derivee n'herite pas aussi de CWnd.
Naturellement, il faut aussi avoir des membres virtuels où il faut
pour que dynamic_cast fonctionne.
Je ne commenterai pas sur la structure initiale,
CBaseUI::GetWindowRect(CRect* rect) {
dynamic_cast<CWnd&>(*this).GetWindowRect(rect);
}
dynamic_cast<CWnd&> plutot que dynamic_cast<CWnd*> pour avoir une
exception plutot que dereferencer un pointeur nul si la classe la plus
derivee n'herite pas aussi de CWnd.
Naturellement, il faut aussi avoir des membres virtuels où il faut
pour que dynamic_cast fonctionne.
Je ne commenterai pas sur la structure initiale,
CBaseUI::GetWindowRect(CRect* rect) {
dynamic_cast<CWnd&>(*this).GetWindowRect(rect);
}
dynamic_cast<CWnd&> plutot que dynamic_cast<CWnd*> pour avoir une
exception plutot que dereferencer un pointeur nul si la classe la plus
derivee n'herite pas aussi de CWnd.
Naturellement, il faut aussi avoir des membres virtuels où il faut
pour que dynamic_cast fonctionne.
dynamic_cast<CWnd&> plutot que dynamic_cast<CWnd*> pour avoir une
exception plutot que dereferencer un pointeur nul si la classe la plus
derivee n'herite pas aussi de CWnd.
Quoique le cas ne doive en principe pas se produire, je vais suivre ce
conseil. Je suppose que si j'avais opté pour le pointeur ç'aurait été :
dynamic_cast<CWnd*>(this)->GetWindowRect(rect);
Naturellement, il faut aussi avoir des membres virtuels où il faut
pour que dynamic_cast fonctionne.
Lesquels ? La méthode GetWindowRect() dans CWnd ? La même mais dans
CBaseUI ? Autre ?
dynamic_cast<CWnd&> plutot que dynamic_cast<CWnd*> pour avoir une
exception plutot que dereferencer un pointeur nul si la classe la plus
derivee n'herite pas aussi de CWnd.
Quoique le cas ne doive en principe pas se produire, je vais suivre ce
conseil. Je suppose que si j'avais opté pour le pointeur ç'aurait été :
dynamic_cast<CWnd*>(this)->GetWindowRect(rect);
Naturellement, il faut aussi avoir des membres virtuels où il faut
pour que dynamic_cast fonctionne.
Lesquels ? La méthode GetWindowRect() dans CWnd ? La même mais dans
CBaseUI ? Autre ?
dynamic_cast<CWnd&> plutot que dynamic_cast<CWnd*> pour avoir une
exception plutot que dereferencer un pointeur nul si la classe la plus
derivee n'herite pas aussi de CWnd.
Quoique le cas ne doive en principe pas se produire, je vais suivre ce
conseil. Je suppose que si j'avais opté pour le pointeur ç'aurait été :
dynamic_cast<CWnd*>(this)->GetWindowRect(rect);
Naturellement, il faut aussi avoir des membres virtuels où il faut
pour que dynamic_cast fonctionne.
Lesquels ? La méthode GetWindowRect() dans CWnd ? La même mais dans
CBaseUI ? Autre ?
Quoique le cas ne doive en principe pas se produire, je vais suivre ce
conseil. Je suppose que si j'avais opté pour le pointeur ç'aurait été :
dynamic_cast<CWnd*>(this)->GetWindowRect(rect);
Gagne. Tu peux aussi opter pour cela mais en verifiant que le
pointeur n'est pas nul et en faisant quelque chose d'approprie dans ce
cas.
CBaseUI doit avoir au moins un membre virtuel.
Quoique le cas ne doive en principe pas se produire, je vais suivre ce
conseil. Je suppose que si j'avais opté pour le pointeur ç'aurait été :
dynamic_cast<CWnd*>(this)->GetWindowRect(rect);
Gagne. Tu peux aussi opter pour cela mais en verifiant que le
pointeur n'est pas nul et en faisant quelque chose d'approprie dans ce
cas.
CBaseUI doit avoir au moins un membre virtuel.
Quoique le cas ne doive en principe pas se produire, je vais suivre ce
conseil. Je suppose que si j'avais opté pour le pointeur ç'aurait été :
dynamic_cast<CWnd*>(this)->GetWindowRect(rect);
Gagne. Tu peux aussi opter pour cela mais en verifiant que le
pointeur n'est pas nul et en faisant quelque chose d'approprie dans ce
cas.
CBaseUI doit avoir au moins un membre virtuel.
[...] Si j'ai bonne memoire -- quelqu'un peut-il confirmer, je n'ai
pas de bonne reference sous la main ce qui etait la raison pour
laquelle j'ai ete vague -- il n'y a pas de condition sur CWnd.
[...] Si j'ai bonne memoire -- quelqu'un peut-il confirmer, je n'ai
pas de bonne reference sous la main ce qui etait la raison pour
laquelle j'ai ete vague -- il n'y a pas de condition sur CWnd.
[...] Si j'ai bonne memoire -- quelqu'un peut-il confirmer, je n'ai
pas de bonne reference sous la main ce qui etait la raison pour
laquelle j'ai ete vague -- il n'y a pas de condition sur CWnd.
Je reprends un code C++ (sur Windows avec MFC) que je dois étendre. En
particulier je suis tombé sur un truc qui ne me semble pas très propre,
et je voudrais savoir comment l'améliorer.
Il y a une classe de base, mettons CBaseUI, qui est dérivée plusieurs
fois. Chacune des classe dérivées dérive aussi d'une sous-classe du CWnd
des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton, etc., sont
dérivées de CWnd, ce qui fait que les classes dérivées de CBaseUI sont
elles-mêmes dérivées de CWnd -- mais pas CBaseUI elle-même.
Le besoin est, à partir d'un pointeur CBaseUI * pointant vers l'une des
sous-classes, d'appeler la méthode GetWindowRect (définie dans CWnd).
l'implémentation actuelle passe par une fonction virtuelle dans CBaseUI,
définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
Par ailleurs, sans rien changer d'autre, puis-je au moins remplacer :
((CWnd *)this)->GetWindowRect(rect);
par :
CWnd::GetWindowRect(rect);
dans chaque classe dérivée ?
Je reprends un code C++ (sur Windows avec MFC) que je dois étendre. En
particulier je suis tombé sur un truc qui ne me semble pas très propre,
et je voudrais savoir comment l'améliorer.
Il y a une classe de base, mettons CBaseUI, qui est dérivée plusieurs
fois. Chacune des classe dérivées dérive aussi d'une sous-classe du CWnd
des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton, etc., sont
dérivées de CWnd, ce qui fait que les classes dérivées de CBaseUI sont
elles-mêmes dérivées de CWnd -- mais pas CBaseUI elle-même.
Le besoin est, à partir d'un pointeur CBaseUI * pointant vers l'une des
sous-classes, d'appeler la méthode GetWindowRect (définie dans CWnd).
l'implémentation actuelle passe par une fonction virtuelle dans CBaseUI,
définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
Par ailleurs, sans rien changer d'autre, puis-je au moins remplacer :
((CWnd *)this)->GetWindowRect(rect);
par :
CWnd::GetWindowRect(rect);
dans chaque classe dérivée ?
Je reprends un code C++ (sur Windows avec MFC) que je dois étendre. En
particulier je suis tombé sur un truc qui ne me semble pas très propre,
et je voudrais savoir comment l'améliorer.
Il y a une classe de base, mettons CBaseUI, qui est dérivée plusieurs
fois. Chacune des classe dérivées dérive aussi d'une sous-classe du CWnd
des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton, etc., sont
dérivées de CWnd, ce qui fait que les classes dérivées de CBaseUI sont
elles-mêmes dérivées de CWnd -- mais pas CBaseUI elle-même.
Le besoin est, à partir d'un pointeur CBaseUI * pointant vers l'une des
sous-classes, d'appeler la méthode GetWindowRect (définie dans CWnd).
l'implémentation actuelle passe par une fonction virtuelle dans CBaseUI,
définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
Par ailleurs, sans rien changer d'autre, puis-je au moins remplacer :
((CWnd *)this)->GetWindowRect(rect);
par :
CWnd::GetWindowRect(rect);
dans chaque classe dérivée ?
Bonjour,
Je reprends un code C++ (sur Windows avec MFC) que je dois étendre. En
particulier je suis tombé sur un truc qui ne me semble pas très propre,
et je voudrais savoir comment l'améliorer.
Il y a une classe de base, mettons CBaseUI, qui est dérivée plusieurs
fois. Chacune des classe dérivées dérive aussi d'une sous-classe du CWnd
des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton, etc., sont
dérivées de CWnd, ce qui fait que les classes dérivées de CBaseUI sont
elles-mêmes dérivées de CWnd -- mais pas CBaseUI elle-même.
Le besoin est, à partir d'un pointeur CBaseUI * pointant vers l'une des
sous-classes, d'appeler la méthode GetWindowRect (définie dans CWnd).
l'implémentation actuelle passe par une fonction virtuelle dans CBaseUI,
définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
Ma question principale est : y a-t-il un moyen pour éviter de redéfinir
GetWindowRect vingt fois, avec vingt fois le même code ? J'ai essayé de
dériver CBaseUI de CWnd, mais alors j'obtiens des tas d'erreurs de
compilation « CTextUI::uneméthode is ambiguous ».
Par ailleurs, sans rien changer d'autre, puis-je au moins remplacer :
((CWnd *)this)->GetWindowRect(rect);
par :
CWnd::GetWindowRect(rect);
dans chaque classe dérivée ?
Bonjour,
Je reprends un code C++ (sur Windows avec MFC) que je dois étendre. En
particulier je suis tombé sur un truc qui ne me semble pas très propre,
et je voudrais savoir comment l'améliorer.
Il y a une classe de base, mettons CBaseUI, qui est dérivée plusieurs
fois. Chacune des classe dérivées dérive aussi d'une sous-classe du CWnd
des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton, etc., sont
dérivées de CWnd, ce qui fait que les classes dérivées de CBaseUI sont
elles-mêmes dérivées de CWnd -- mais pas CBaseUI elle-même.
Le besoin est, à partir d'un pointeur CBaseUI * pointant vers l'une des
sous-classes, d'appeler la méthode GetWindowRect (définie dans CWnd).
l'implémentation actuelle passe par une fonction virtuelle dans CBaseUI,
définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
Ma question principale est : y a-t-il un moyen pour éviter de redéfinir
GetWindowRect vingt fois, avec vingt fois le même code ? J'ai essayé de
dériver CBaseUI de CWnd, mais alors j'obtiens des tas d'erreurs de
compilation « CTextUI::uneméthode is ambiguous ».
Par ailleurs, sans rien changer d'autre, puis-je au moins remplacer :
((CWnd *)this)->GetWindowRect(rect);
par :
CWnd::GetWindowRect(rect);
dans chaque classe dérivée ?
Bonjour,
Je reprends un code C++ (sur Windows avec MFC) que je dois étendre. En
particulier je suis tombé sur un truc qui ne me semble pas très propre,
et je voudrais savoir comment l'améliorer.
Il y a une classe de base, mettons CBaseUI, qui est dérivée plusieurs
fois. Chacune des classe dérivées dérive aussi d'une sous-classe du CWnd
des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton, etc., sont
dérivées de CWnd, ce qui fait que les classes dérivées de CBaseUI sont
elles-mêmes dérivées de CWnd -- mais pas CBaseUI elle-même.
Le besoin est, à partir d'un pointeur CBaseUI * pointant vers l'une des
sous-classes, d'appeler la méthode GetWindowRect (définie dans CWnd).
l'implémentation actuelle passe par une fonction virtuelle dans CBaseUI,
définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
Ma question principale est : y a-t-il un moyen pour éviter de redéfinir
GetWindowRect vingt fois, avec vingt fois le même code ? J'ai essayé de
dériver CBaseUI de CWnd, mais alors j'obtiens des tas d'erreurs de
compilation « CTextUI::uneméthode is ambiguous ».
Par ailleurs, sans rien changer d'autre, puis-je au moins remplacer :
((CWnd *)this)->GetWindowRect(rect);
par :
CWnd::GetWindowRect(rect);
dans chaque classe dérivée ?
Olivier Miakinen wrote on 22/05/2006 15:53:Il y a une classe de base, mettons CBaseUI, qui est dérivée
plusieurs fois. Chacune des classe dérivées dérive aussi
d'une sous-classe du CWnd des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton,
etc., sont dérivées de CWnd, ce qui fait que les classes
dérivées de CBaseUI sont elles-mêmes dérivées de CWnd --
mais pas CBaseUI elle-même.
le schéma me parait consistant - vu l'arborescence de pseudo-classes des
MFC - et CBaseUI ne pouvait en effet pas hériter de CWnd car les MFC
ignore l'héritage virtuel (on peut aussi prévilégier un schéma sa ns les
MFC, WTL par exemple).Le besoin est, à partir d'un pointeur CBaseUI * pointant
vers l'une des sous-classes, d'appeler la méthode
GetWindowRect (définie dans CWnd).
ben y-a-qu'à alors !
la virtualité est impossible mais un cast vers une classe
fille par voies détournées est possible:
bool CBaseUI::getRect(RECT& rect){
CWnd* wnd = reinterpret_cast<CWnd*>(*this);
return (wnd) ? (wnd->GetWindowRect(&rect) == TRUE) : false;
}
donc l'accès à GetW_Rect depuis un CBaseUI* est possible.l'implémentation actuelle passe par une fonction virtuelle
dans CBaseUI, définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
c'est tordu, ici GetWindowRect est apporté visiblement par
CEdit, son implémentation dévirtualise CBaseUI (s'il définit
la méthode virtuelle pure) et cache la méthode de CEdit (reçu
de CWnd) ... pourquoi faire simple ?...
Olivier Miakinen wrote on 22/05/2006 15:53:
Il y a une classe de base, mettons CBaseUI, qui est dérivée
plusieurs fois. Chacune des classe dérivées dérive aussi
d'une sous-classe du CWnd des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton,
etc., sont dérivées de CWnd, ce qui fait que les classes
dérivées de CBaseUI sont elles-mêmes dérivées de CWnd --
mais pas CBaseUI elle-même.
le schéma me parait consistant - vu l'arborescence de pseudo-classes des
MFC - et CBaseUI ne pouvait en effet pas hériter de CWnd car les MFC
ignore l'héritage virtuel (on peut aussi prévilégier un schéma sa ns les
MFC, WTL par exemple).
Le besoin est, à partir d'un pointeur CBaseUI * pointant
vers l'une des sous-classes, d'appeler la méthode
GetWindowRect (définie dans CWnd).
ben y-a-qu'à alors !
la virtualité est impossible mais un cast vers une classe
fille par voies détournées est possible:
bool CBaseUI::getRect(RECT& rect){
CWnd* wnd = reinterpret_cast<CWnd*>(*this);
return (wnd) ? (wnd->GetWindowRect(&rect) == TRUE) : false;
}
donc l'accès à GetW_Rect depuis un CBaseUI* est possible.
l'implémentation actuelle passe par une fonction virtuelle
dans CBaseUI, définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
c'est tordu, ici GetWindowRect est apporté visiblement par
CEdit, son implémentation dévirtualise CBaseUI (s'il définit
la méthode virtuelle pure) et cache la méthode de CEdit (reçu
de CWnd) ... pourquoi faire simple ?...
Olivier Miakinen wrote on 22/05/2006 15:53:Il y a une classe de base, mettons CBaseUI, qui est dérivée
plusieurs fois. Chacune des classe dérivées dérive aussi
d'une sous-classe du CWnd des Microsoft Fondation Classes :
class CTextUI : public CBaseUI, public CEdit;
class CPasswordUI : public CBaseUI, public CEdit;
class CEnumUI : public CBaseUI, public CComboBox;
class CDateUI : public CBaseUI, public CDateTimeCtrl;
etc.
Toutes les classes CEdit, CComboBox, CDateTimeCtrl, CButton,
etc., sont dérivées de CWnd, ce qui fait que les classes
dérivées de CBaseUI sont elles-mêmes dérivées de CWnd --
mais pas CBaseUI elle-même.
le schéma me parait consistant - vu l'arborescence de pseudo-classes des
MFC - et CBaseUI ne pouvait en effet pas hériter de CWnd car les MFC
ignore l'héritage virtuel (on peut aussi prévilégier un schéma sa ns les
MFC, WTL par exemple).Le besoin est, à partir d'un pointeur CBaseUI * pointant
vers l'une des sous-classes, d'appeler la méthode
GetWindowRect (définie dans CWnd).
ben y-a-qu'à alors !
la virtualité est impossible mais un cast vers une classe
fille par voies détournées est possible:
bool CBaseUI::getRect(RECT& rect){
CWnd* wnd = reinterpret_cast<CWnd*>(*this);
return (wnd) ? (wnd->GetWindowRect(&rect) == TRUE) : false;
}
donc l'accès à GetW_Rect depuis un CBaseUI* est possible.l'implémentation actuelle passe par une fonction virtuelle
dans CBaseUI, définie dans chacune des sous-classes par :
void CTextUI::GetWindowRect(CRect *rect) // idem CPasswordUI, etc.
{
((CWnd *)this)->GetWindowRect(rect);
}
c'est tordu, ici GetWindowRect est apporté visiblement par
CEdit, son implémentation dévirtualise CBaseUI (s'il définit
la méthode virtuelle pure) et cache la méthode de CEdit (reçu
de CWnd) ... pourquoi faire simple ?...