在C ++中将实现注入到类中

时间:2014-05-04 09:21:24

标签: c++ class oop inheritance abstract-class

考虑以下示例:

class A{
public: virtual void  hello() = 0;
};

class B: public A{};

class C {
    public: void hello(){
        cout<<"Hi";
    }
};
class D: public B, public C{};

我的想法是,我想将hello的实施注入DC。除非我从{A}继承C,否则这似乎不起作用。由于这导致钻石继承,我最终使用虚拟继承。

是否可以在不干扰抽象类AB的情况下强制实现派生类?

编辑:我想要一个解决方案,我不需要在D内明确编写代码。这是因为我有许多类D具有相同的实现,这正是我想将该实现推送到所有类继承的类的原因。

3 个答案:

答案 0 :(得分:2)

您可以将C重写为继承自其模板参数的模板类,然后从C派生D.

template <class Base>
class C : public Base {
    public: void hello(){
        cout<<"Hi";
    }
};
class D: public C<B> {};

答案 1 :(得分:1)

当您需要外部方法注入类层次结构时,可以考虑静态继承/策略类。请注意,注入方法通常意味着该方法与类层次结构中的现有虚拟机不具有相同的名称(如果是,则强制使用虚拟继承或使用范围::显式调用或插入它在类层次结构中)。我在这里调用了方法externalHello

其他选项也可以正常工作,但它们在概念上更多地指出了这样一个事实,即注入的方法实际上并不是一个可以在这个类层次结构之外使用的抽象方法,但它应该首先成为它的一部分。 / p>

class A
{
    public: 
        virtual void  hello() = 0;
};

class B: public A 
{
    public: 
    void hello()
    {
        cout<<"Hi from B" << endl;
    };

};

template<typename T> class C1 
{
    public: 
    void injectedMethodUnrelatedToClassHierarchy()
    {
        cout<<"Hi from C1 with unrelated method" << endl;
    };    
    void externalHello() 
    {
        static_cast<T*>(this)->hello(); // will still call hello in B
        injectedMethodUnrelatedToClassHierarchy(); // this will call hello here
    };
};

class D: public B, public C1<D>{};

使用客户端代码:

D dx;    
dx.hello();
dx.externalHello();
dx.injectedMethodUnrelatedToClassHierarchy();

答案 2 :(得分:0)

它可能有用

#include<iostream>
using namespace std;

class A
{
 public: 
    virtual void  hello() = 0;
};

class C {
   public: void hello(){
    cout<<"Hi\n";
  }
};

template<typename T>
class B: public A, public T
{
  public:   
    void hello() override{ //override A::hello()
    //do other staff

    T::hello(); // call C::hello()
   }
};



 class D: public B<C>{

  };

 int main()
 {
  D d;
  d.hello();
  return 0;
 }