C++:重新定义子类中的一个或另一个操作
C++: Redefine one or the other operation in the child class
在下面的代码中:
class GraphicalCardDeck : public CardDeck, public GraphicalObject {
public:
virtual void draw () {
return CardDeck::draw();
}
virtual void paint () {
GraphicalObject::draw();
}
}
GraphicalCardDeck gcd;
gcd->draw(); // selects CardDeck draw
gcd->paint(); // selects GraphicalObject draw
在类CardDeck
中有一个名为draw
的函数,在类GraphicalObject
中有一个名为draw
的函数。
书中提到了一个问题:
GraphicalObject* g = new GraphicalCardDeck();
g->draw(); // opps, doing wrong method!
为什么它会调用错误的方法?它不会像我们定义的那样调用类CardDeck
中draw
函数?
谢谢。
是的,它将调用我们定义的CardDeck
中draw
函数。但对于不熟悉我们类内部的人来说,这可能会令人惊讶:
GraphicalObject* g = new GraphicalCardDeck();
g->draw(); // opps, doing wrong method!
编写此内容的人可能希望调用GraphicalObject::draw()
(或至少是提供相同功能的该函数的覆盖版本)。由于我们的覆盖函数提供了完全不同的功能(CardDeck
所要求的),因此从编写上述代码的人的角度来看,调用了"错误"函数(也就是不是他打算调用的函数)。
因此,它的工作方式与您预期的那样,但是当仅查看界面并且不了解内部实现时,可能会期望不同的行为。
相关文章:
- 为什么一个向量上的多线程操作很慢
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 完成任何一个操作后,该程序会自动退出,为什么?
- 编译一个自定义的tf操作,其中输入是5d张量
- 是否有一个C++函数可以准确返回平方根反比的内置 CPU 操作 RSQRTSS 的值?
- 在 "CodePad" 中执行链表操作时转储的核心(这是一个在线C++编译器)
- 如何仅覆盖一个EXPECT_CALL的默认ON_CALL操作,并在以后返回到默认操作
- 是新的(&*p)双倍;一个无操作。因此,uninitialized_default_construct是否也变得无操作?
- 当我尝试在 tensorflow 中添加一个新操作时如何 #include "include/libxsmm.h"?
- 发送到另一个窗口的鼠标移动消息不执行任何操作
- 递归推动POP POSTFIX计算器无法正确执行操作,只需将最后一个数字作为结果
- 我想知道像素/片段的原始模板值.零还是一个?如果可能的话,以获取哪些特定操作会修改模板值
- 内联一个操作堆上数据的函数
- 阵列操作,复制最后一个元素
- 打开一个文件,修改每个字符,然后执行反向操作不输出原始文件
- 需要帮助创建一个休眠条件的循环,当满足条件时,它会停止,直到下一个操作
- 两个 UShorts 之间的操作在 VC2015 中给出了一个 int
- 如何编写两个初始化操作(一个作为默认初始化,另一个作为用户输入)?两者都是类的构造函数C++
- 在另一个类的两个函数中操作一个类的向量