Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 虚拟/非虚拟继承_C++_Templates_Inheritance_Virtual - Fatal编程技术网

C++ 虚拟/非虚拟继承

C++ 虚拟/非虚拟继承,c++,templates,inheritance,virtual,C++,Templates,Inheritance,Virtual,假设我有一个基类: struct A{ virtual void foo() = 0; }; 然后假设我有这样一个派生类: struct B : public virtual A{ void foo(){ /*something*/ } }; struct A { virtual void foo() = 0; }; struct Virtual: virtual A {}; struct Non_virtual: A {}; template< class

假设我有一个基类:

struct A{
  virtual void foo() = 0;  
};
然后假设我有这样一个派生类:

struct B : public virtual A{ 
  void foo(){ /*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>;
但是我还想要一个这样的
B
副本(请注意,除了没有虚拟继承之外,它在各个方面都是相同的):

有没有一种模板魔法可以用一个定义来实现这一点

像这样的东西

struct B : public InheritanceHelper<A> {
  void foo(){ /*same something*/ }
};
结构B:公共继承帮助器{ void foo(){/*相同的东西*/} };
很抱歉,我看不出您试图解决的实际问题。这意味着我不能就如何更好地解决这一问题提供建议,而只能提供所述技术问题的技术解决方案。使用这样的技术解决方案可能适得其反

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

struct B : public virtual A{ 
  void foo(){ /*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>;
结构A { 虚拟void foo()=0; }; 结构虚拟:虚拟A{}; 非虚拟结构:A{}; 模板 结构B_2;:基础 { void foo()重写{};//某些内容。 }; 使用B_virtual=B_; 使用B_非虚拟=B_;
免责声明:上面的代码没有经过编译器审查。

这实际上是完美的(我不敢相信答案就在眼前!)在这一点上,为a和B编写构造函数是一个非常有趣的挑战:)。