是否有可能有一个基类方法调用其所有派生类的相同(但被覆盖的方法)?

Posted

技术标签:

【中文标题】是否有可能有一个基类方法调用其所有派生类的相同(但被覆盖的方法)?【英文标题】:Is it possible to have a base class method that calls the same (but overridden method) of all it's derived classes? 【发布时间】:2012-02-28 15:32:04 【问题描述】:

语言有点难解释,我举个例子吧:

(以下代码可能语法不正确,但足以给出一个想法)

class A

public:
   static void Update(UINT someValue);
;

class B : public A

public:
   static void Update(UINT someValue);
;

class C : public A

public:
   static void Update(UINT someValue);
;

我知道静态成员函数不会相互覆盖, 但让我们假设他们这样做。 我想要实现的是当A::Update(someValue); 被调用时, 它应该隐式调用 B::Update(someValue) 和 C::Update(someValue),以及调用从 A 派生的其他类的每个 static void Update(UINT someValue) 方法

这可能以某种方式实现吗? 如果是,你会怎么做?

【问题讨论】:

这是不可能的,而且会违背 OOP 的目的。父类不知道它的子类。 这些类将如何被实例化? @Andres 好吧,就我的代码而言:Specific_Material spM; Material* pM = &spM; 【参考方案1】:

我认为您应该改用复合模式。您可以在http://en.wikipedia.org/wiki/Composite_pattern 和http://www.javacamp.org/designPattern/composite.html 阅读有关它的信息

【讨论】:

这是一种非常狂野的设计模式哈哈,适合我的需要:)【参考方案2】:

我评论下方的信息不足以清楚地了解您的代码,但我在想是否有可能做一些类似于 C# 对事件所做的事情,您可以在其中注册事件和触发的类(在这种情况下,您的基类)可以实现函数指针列表(指向派生方法,在这种情况下,您必须拥有派生类的实例)并调用所有函数指针然后迭代该列表。只是一个想法,不知道是不是你需要的。

【讨论】:

这可能是一种解决方案,是的,但 atm 我认为复合设计模式是更好的选择【参考方案3】:

没有办法自动完成。获得效果的一个简单方法是让每个派生类调用其基类的函数:

class A

  public:
    static void Update(UINT someValue) 
        std::cout << "A\n";
    
;

class B : public A

  public:
    static void Update(UINT someValue) 
        A::Update(someValue);
        std::cout << "B\n";
    
;

如果您更喜欢从下到上工作,您可以让每个类在调用派生类之前完成其工作。当然,没有什么可以阻止派生类实现Update 并且 调用它的基类。然而,一个类完全不实现Update 也很好——它不关心更新,但它的基类的函数仍然可以被调用。所以这对实现者来说不是一个巨大的负担,他们只需要遵循如果他们实现函数,他们必须调用基的规则。

另一种方法可能是基类保留对更新感兴趣的“侦听器”列表,并在更新发生时依次调用它们。然后每个派生类都可以注册一个合适的监听器。

但是,如果每个级别都进行更改但一个或多个级别可能会抛出,则可能很难使这种异常安全的代码。

【讨论】:

以上是关于是否有可能有一个基类方法调用其所有派生类的相同(但被覆盖的方法)?的主要内容,如果未能解决你的问题,请参考以下文章

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

拥有所有从同一个基类派生的类实例集合的最佳方法是啥?

从具有相同基的另一个派生类调用派生类的非常量方法

不是抽象类的基类不是好基类

如何简洁地比较许多派生类的基类的值并调用它们的函数?

基类 派生类 类的继承与约束