【问题标题】:Force derived class to call base function强制派生类调用基函数
【发布时间】:2010-12-26 23:12:07
【问题描述】:

如果我从另一个类派生一个类并覆盖一个函数,我可以通过在派生类的myFunc 的实现中调用Base::myFunction() 来调用基函数。

但是-有没有办法在我的Base 类中定义在任何情况下都会调用基函数,而无需在覆盖函数中显式调用它? (在派生函数执行之前或之后)

或者更好的是,如果我的虚拟Base 类中有一个虚函数,并且有两个实现的私有函数before()after(),是否可以在Base 类中定义调用此Base 类的任何派生类中的函数,将调用before()after()

谢谢!

【问题讨论】:

  • 可能是 C++(Base::myFunction 似乎是 C++)
  • 我不禁认为这需要面向方面的编程,尽管遗憾的是仍然缺乏实现。

标签: c++ inheritance virtual overwrite base-class


【解决方案1】:

您试图阻止派生类重载/覆盖基类中的方法。您可以通过将方法标记为“不可覆盖”(取决于语言)来鼓励它,但总有办法绕过它。

换句话说,您不能强迫某人以特定方式使用您的课程,而只能告诉他们应该使用的方式。

【讨论】:

    【解决方案2】:

    不,这是不可能的。
    但是你可以通过调用不同的虚函数来模拟它,如下所示:

    class Base
    {
    public:
      void myFunc()
      {
        before();
        doMyFunc();
        after();
      }
    
      virtual void doMyFunc() = 0;
    };
    

    【讨论】:

    • 如果您将虚拟函数设为受保护(甚至是私有),那么您将禁止其他代码通过对 base 的引用直接调用虚拟方法(如果它们具有对派生类型的引用,则不会,因为派生类可以使方法公开)
    【解决方案3】:

    对于 C++ 的回答,您不能以您想要的方式“不可见地”调用继承的函数。

    通过继承类调用的唯一方法是构造函数和析构函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-28
      • 2014-01-01
      • 2011-06-19
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      相关资源
      最近更新 更多