【问题标题】:Virtual/Non-virtual inheritance虚拟/非虚拟继承
【发布时间】:2016-10-26 13:15:35
【问题描述】:

假设我有一个基类:

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

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

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*/ }
};

【问题讨论】:

    标签: c++ templates inheritance virtual


    【解决方案1】:

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

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

    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>;
    

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

    【讨论】:

    • 这实际上是完美的(我不敢相信答案正盯着我的脸!)
    • 此时,为 A 和 B_ 编写构造函数是一个非常有趣的挑战 :)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 2012-09-27
    • 1970-01-01
    • 2013-08-24
    • 2015-09-09
    相关资源
    最近更新 更多