Virtual/Non-virtual继承

Virtual/Non-virtual inheritance

假设我有一个基地 class:

struct A{
  virtual void foo() = 0;  
};

然后假设我有一个像这样的派生 class:

struct B : public virtual A{ 
  void foo(){ /*something*/ }
};

但我也想要一个像这样的 B 的副本(请注意,除了没有虚拟继承外,它在各个方面都是相同的):

struct B : public A{ 
  void foo(){ /*same something*/ }
};

是否有某种模板魔术可以只用一个定义来做到这一点。

类似这样的东西??

struct B : public InheritanceHelper<A> {
  void foo(){ /*same something*/ }
};

抱歉,我没有看到您要解决的现实问题。这意味着我无法就如何以更好的方式解决该问题提供建议,而只能针对所述技术问题提供技术解决方案。使用这样的技术解决方案可能会适得其反。

不过,技术 解决方案可以像这样:

struct A
{
    virtual void foo() = 0;
};

struct Virtual: virtual A {};
struct Non_virtual: A {};

template< class Base >
struct B_: Base
{
    void foo() override {};    // Something.
};

using B_virtual = B_<Virtual>;
using B_nonvirtual = B_<Non_virtual>;

免责声明:以上代码未经编译器审查。