强制派生类调用基函数

6
如果我从另一个类派生出一个类并覆盖一个函数,我可以在派生类的实现中通过调用Base::myFunction()来调用基函数。
然而,有没有一种方法在我的Base类中定义基函数,在覆盖的函数中没有明确调用的情况下,在任何情况下都会调用基函数呢?(在派生函数执行之前或之后)
甚至更好的是,如果我在虚拟Base类中有一个虚拟函数,并且有两个已实现的私有函数before()after(),是否可能在Base类中定义,在调用此Base类的任何派生类的函数之前和之后,都将调用before()after()
谢谢!

2
可能是 C++(Base::myFunction 看起来像 C++) - David Rodríguez - dribeas
我忍不住认为这需要面向切面编程,尽管可惜的是实现还不足。 - Georg Fritzsche
3个回答

21
不,这是不可能的。
但是您可以通过调用另一个虚函数来模拟它,例如:
class Base
{
public:
  void myFunc()
  {
    before();
    doMyFunc();
    after();
  }

  virtual void doMyFunc() = 0;
};

8
如果将虚函数声明为protected(甚至是private),那么你就禁止了其他代码通过引用基类直接调用这个虚方法(但如果它们拥有一个派生类型的引用,则不会受到影响,因为派生类可以将该方法公开可用)。 - David Rodríguez - dribeas

0
您正在尝试防止派生类在基类中重载/覆盖方法。您可以通过将方法标记为“不可重写”(根据语言而定)来鼓励它,但总有一种绕过它的方法。
换句话说,您不能强制某人以特定的方式使用您的类,只能告诉他们应该如何使用它。

0
对于C++来说,你无法以你想要的方式调用继承函数。
唯一能够沿着继承类调用的方法是构造函数和析构函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接