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

Why this function get invoked exactly once

本文关键字:一次 调用 函数 为什么      更新时间:2023-10-16

我正在阅读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()一次。

但是我认为,当你定义一个时钟对象并调用draw()时,它会被调用三次。这样的

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:画();
  3. Window_with_menu:画();

你可以提交第一个,然后像这样重写:

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(); }
};