为什么这个函数只被调用一次
Why this function get invoked exactly once
我正在阅读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()
被调用了三次:
- 窗口:画();
- Window_with_border:画();
- 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(); }
};
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 什么是仅调用一次并调用参数的控制台应用
- 谷歌基准测试,如何只调用一次代码?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- 在可变函数调用中执行一次语句
- 我应该只在免费商店上为一次调用创建对象吗?
- 如果初始化需要shared_from_this,如何在一次调用中构建一个类
- GoogleMock:如何保存参数,以便在模拟上的下一次调用中使用
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- C++ 向量元素被最后一次调用push_back替换
- 在一次调用C++11中启动多个线程
- opengl/glut 中的 renderDisplayFunc 不止一次调用 myfunc
- 为什么popn()一次又一次调用返回相同的输出
- 如何只对move构造函数进行一次调用?
- 通过一次调用c++将整个二进制文件读取到一个数组中
- 在一次调用中重置使用 iomanip 所做的所有更改的类:setprecision、setfill 和标志
- 圆函数:一次调用绘制多个圆