2009-12-15 64 views
6

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

但是 - 是否有一种方法可以在我的Base类中定义基函数在任何情况下都被调用,而且不会在覆盖函数中显式调用基函数? (之前或执行派生功能之后)

甚至更​​好,如果我有我的虚拟Base类的虚函数,和两个实现的私有函数before()after(),是否有可能在Base类之前定义并且在调用此类Base类的任何派生类中的函数后,将调用before()after()

谢谢!

+4

这是什么语言? – 2009-12-15 19:56:23

+2

很可能C++('Base :: myFunction'好像是C++) – 2009-12-15 20:06:23

+0

我不禁想到这需要面向方面的编程,尽管可悲的是实现仍然缺乏。 – 2009-12-15 20:38:58

回答

21

不,这是不可能的。
但是你可以通过调用不同的虚拟功能,像这样模拟它:

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

    virtual void doMyFunc() = 0; 
}; 
+0

+1,我刚刚发布了这个建议。 – Roddy 2009-12-15 20:02:18

+8

如果您使虚拟函数受保护(甚至是私有的),那么您可以禁止其他代码直接通过对基础的引用调用虚拟方法(如果它们具有对派生类型的引用,则派生类可以公开该方法可用) – 2009-12-15 20:08:04

+0

这服务我的需求!谢谢 :) – Mat 2009-12-15 20:08:56

0

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

换句话说,你不能强迫某人以特定的方式使用你的班级,只告诉他们应该使用它的方式。

+1

不 - 我想要的方法被覆盖 - 但我希望在派生类中实现之前调用基本函数 – Mat 2009-12-15 20:07:43

+0

有趣的是,我得到了一个downvote * 3 *年后没有任何评论。 – hometoast 2012-07-09 11:03:44

0

回答了C++,你不能有一个继承功能“无形”叫你想要的方式。

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