提问人:AlexusXX 提问时间:3/21/2023 最后编辑:AlexusXX 更新时间:3/21/2023 访问量:94
在类外调用被覆盖的方法之前,如何调用虚拟方法?
How to call the virtual method before calling overriden method outside the class?
问:
显而易见的解决方案是:
class GUI{
public:
virtual void render() {
//Common render code
}
}
class MainGUI : public GUI {
private:
void render() override {
GUI::render();
//MainGUI render code
}
}
int main(...){
GUI* mainGUI = new MainGUI();
mainGUI->render();
}
Common render code
将在执行 .MainGUI render code
但是,如果我不想调用继承 GUI 的每个类怎么办?以及如何仅将虚拟方法打开到特定方法?GUI::render();
render()
我的第一个想法是使用一个单独的方法来调用,然后调用虚拟方法:Common render code
class GUI{
public:
void render(){
//Common render code
renderImpl();
}
private:
virtual void renderImpl() = 0;
}
class MainGUI : public GUI {
private:
void renderImpl() override {
//MainGUI render code
}
}
int main(...){
GUI* mainGUI = new MainGUI();
mainGUI->render();
}
此代码解决了第一个问题,但不能解决第二个问题。我可以将非虚拟设为私有,然后指定为好友打开该类的所有隐藏方法和字段。render()
main()
但此解决方案可能会导致调用而不是 .我的意思是程序员的错误。renderImpl()
render()
那么,如何解决这个问题呢?
编辑:
很抱歉造成混淆。我无法正确表述问题标题。
我的主要问题更多地与友好类有关,而不是与虚拟方法有关。@Jarod42的评论为我指出了正确的解决方案。
答:
0赞
user10
3/21/2023
#1
尝试这种模板方法模式,其中您的方法包含步骤 (),您可以:render()
internal_render
override
class GUI {
private:
virtual void internal_render() = 0;
void common_render() {
std::cout << "Common render ";
};
public:
void render() {
common_render();
internal_render();
}
};
class MainGUI : public GUI {
private:
void internal_render() override {
std::cout << "Derived render";
}
};
int main() {
GUI* mainGUI = new MainGUI();
mainGUI->render();
}
上一个:虚拟继承的幕后发生了什么?
评论