C++:重新定义子类中的一个或另一个操作

C++: Redefine one or the other operation in the child class

本文关键字:操作 一个 另一个 子类 新定义 C++ 定义      更新时间:2023-10-16

在下面的代码中:

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!

为什么它会调用错误的方法?它不会像我们定义的那样调用类CardDeckdraw函数?

谢谢。

是的,它将调用我们定义的CardDeckdraw函数。但对于不熟悉我们类内部的人来说,这可能会令人惊讶:

GraphicalObject* g = new GraphicalCardDeck();
g->draw(); // opps, doing wrong method!

编写此内容的人可能希望调用GraphicalObject::draw()(或至少是提供相同功能的该函数的覆盖版本)。由于我们的覆盖函数提供了完全不同的功能(CardDeck 所要求的),因此从编写上述代码的人的角度来看,调用了"错误"函数(也就是不是他打算调用的函数)。

因此,它的工作方式与您预期的那样,但是当仅查看界面并且不了解内部实现时,可能会期望不同的行为。

相关文章: