gpt4 book ai didi

c++ - 为什么这个函数只被调用一次

转载 作者:行者123 更新时间:2023-11-28 06:43:35 27 4
gpt4 key购买 nike

我正在阅读 The C++ Programming Language 3rd edition .在第 15 章(第 398 页)中,它给出了一个小例子。

class Window {
public:
virtual void draw() { //sth }
};
class Window_with_border : public virtual Window {
public:
void own_draw() { //sth }
void draw() {Window::draw(); own_draw();}
};
class Window_with_menu : public virtual Window {
public:
void own_draw() { //sth }
void draw() {Window::draw(); own_draw(); }
};
class Clock : public Window_with_border, public Window_with_menu {
public:
void own_draw() { //sth }
void draw() {Window::draw(); Window_with_border::draw(); Window_with_menu::draw(); own_draw(); }
};

然后作者说draw()现在可以使用 own_draw() 编写函数功能,以便任何 draw() 的调用者得到 Window::draw()恰好调用一次。

但我认为,当您定义一个 Clock 对象并调用 draw() 时,它会被调用 3 次。像这样

Clock obj;
obj.draw() //The Window::draw() function got invoked three times?

我说的对吗?

更新:抱歉,我看错了代码。正确的代码是这样的:

class Clock : public Window_with_border, public Window_with_menu {
public:
void own_draw() { //sth }
void draw() {Window::draw(); Window_with_border::own_draw(); Window_with_menu::own_draw(); own_draw(); }
};

所以我错了

最佳答案

更长的解释:这正是作者所说的 - Window::draw() 被调用了三次:

  1. 窗口::绘制();
  2. Window_with_border::draw();
  3. Window_with_menu::draw();

你可以省略第一个并像这样重写它:

class Clock : public Window_with_border, public Window_with_menu {
public:
void own_draw() { //sth }
void draw() {
Window_with_border::draw();
Window_with_menu::draw();
own_draw(); }
};

但还是两次,所以最后应该是:

class Clock : public Window_with_border, public Window_with_menu {
public:
void own_draw() { //sth }
void draw() {
Window::draw();
Window_with_border::own_draw();
Window_with_menu::own_draw();
own_draw(); }
};

或者:

class Clock : public Window_with_border, public Window_with_menu {
public:
void own_draw() { //sth }
void draw() {
Window_with_border::draw();
Window_with_menu::own_draw();
own_draw(); }
};

关于c++ - 为什么这个函数只被调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25461782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com