0

My questions are related to the following structure : enter image description here

The abstract levels are just here to provide the member function for the "real" classes (D1 and D2). As it needs to be highly optimized, there is no virtuality (the destructors of the abstract levels are protected). Is the part with B0-C1-C2-D1 perfectly ok in the following cases :

  1. B0, C1 and C2 have members function with different names ?

  2. C1 and C2 have a function with the same name (for example myFunction) ?

  3. C1 and C2 and D1 have a function with the same name (for example myFunction) ?

  4. B0 and C2 have a function with the same name but not C1 (for example myFunction) ?

In each case what version of the function will be called by D1 ?

EDIT : a quick piece of code to illustrate that :

template<class CRTP> class A0
{
    public:
        void myfunction1();
    protected:
        ~A0();
        double mymember;
};

template<class CRTP> class B0 : public A0<CRTP>
{
    public:
        void myfunction2();
    protected:
        ~B0();
};

template<class CRTP> class C1 : public B0<CRTP>
{
    public:
        void myfunction3();
    protected:
        ~C1();
};

template<class CRTP> class C2 : public B0<CRTP>
{
    public:
        void myfunction4();
    protected:
        ~C2();
};

class D1 : public C1<D1>, public C2<D1>
{
    public:
        void myfunction5();
};
4

2 回答 2

0

“完全可以”有点主观,但所有情况在语言中都有很好的定义。

您可能D1. 如果合适的话,你可以使用虚拟继承来拥有C1C2继承一个共同的基础。这并不总是合适的,我们很难猜测。

1)

它们是具有不同方法的不同类,没有冲突。

2)

C1或内没有问题C2,但D1会有问题。

3)

必须D1. 继承myFunction的调用将从外部隐藏(无法访问)。您可以像这样从 D1 中调用它们:

struct D1 {
  void myFunction() {
    C1::myFunction();
    C2::myFunction();
  }
}

使用 CRTP 会很烦人。我建议在类定义中使用 typedefs 来保持你的理智。

4)

C1将具有B0赋予它的任何功能。如果它们不可访问,那么在引用它们时会出现编译器错误。

老实说,我建议不要使用这种设计。将所有东西分解成小的具体物体并组合它们。维护这不是一个项目,而是一个职业。

于 2012-08-27T18:11:05.693 回答
0

我不会说没关系,除非你可以接受A0B0两次在你的班级,尽管他们是不同的班级(B0<C1>B0<C2>)。除非您正在做一些专业化,否则这很可能不是您想要的。

一个可能的解决方案是这样的,它删除了多重继承:

template<class CRTP, class Base = B0<CRTP> > class C1 : public Base
{
    public:
        void myfunction3();
    protected:
        ~C1();
};

template<class CRTP, class Base = B0<CRTP> > class C2 : public Base
{
    public:
        void myfunction4();
    protected:
        ~C2();
};

class D1 : public C2<D1,C1<D1>>
{
    public:
        void myfunction5();
};

那么,如果您确实想在其中拥有那颗钻石怎么办,您可以在没有多个基类实例的情况下做到吗?
不,因为
a)正如我所说的基类是不同的,并且
b)在C ++虚拟继承中只适用于具有vtable的类。

于 2012-08-27T18:50:36.560 回答