具有模板化基数 class 的钻石继承:基数<Derived>
Diamond inheritance with templated base class: Base<Derived>
我在从模板化基础 class 继承时遇到菱形问题,它采用 Derived class 作为模板参数。
通常这个问题可以通过这样的虚拟继承来解决:
class Base0
{
protected:
int var = 0;
};
class Base1 : public virtual Base0
{
};
class Base2 : public virtual Base0
{
};
class Derived :
public Base1,
public Base2
{
public:
void f()
{
var = 1; // OK single var
}
};
但是我有这种情况:
template<typename DERIVED_CLASS>
class TemplatedBase0
{
protected:
int var = 0;
};
class Base1 : public virtual TemplatedBase0<Base1>
{
};
class Base2 : public virtual TemplatedBase0<Base2>
{
};
class Derived :
public Base1,
public Base2
{
public:
void f()
{
var = 1; // ERROR: var is ambigous
}
};
我知道在上述情况下,模板化基础 class 是不一样的,即。涉及 2 个完全未实现的基 classes,看起来虚拟继承不起作用。
所以我的问题是,有什么方法可以使它起作用吗? design/approach 我应该带什么来这里?
我需要将基础 class 作为采用派生 class 类型的模板。但是如何让钻石继承成为可能呢?
您的代码中没有钻石。您的 Derived
有两个不同的 var
。根据您的需要写:
Base1::var = 1;
Base2::var = 1;
but how to make diamond inheritance possible?
不清楚您想要钻石的原因。如果您的目标是在 Derived
中只有一个 var
,则需要不同的设计。
如果只想在 Derived
中有一个 int var;
,您需要将其移动到非模板库 class:
class GenericTemplatedBase0
{
protected:
int var = 0;
};
template<typename DERIVED_CLASS>
class TemplatedBase0 : virtual public GenericTemplatedBase0
{
// ...
};
class Base1 : public TemplatedBase0<Base1>
{
};
class Base2 : public TemplatedBase0<Base2>
{
};
class Derived : public Base1, public Base2
{
public:
void f()
{
var = 1;
}
};
我在从模板化基础 class 继承时遇到菱形问题,它采用 Derived class 作为模板参数。
通常这个问题可以通过这样的虚拟继承来解决:
class Base0
{
protected:
int var = 0;
};
class Base1 : public virtual Base0
{
};
class Base2 : public virtual Base0
{
};
class Derived :
public Base1,
public Base2
{
public:
void f()
{
var = 1; // OK single var
}
};
但是我有这种情况:
template<typename DERIVED_CLASS>
class TemplatedBase0
{
protected:
int var = 0;
};
class Base1 : public virtual TemplatedBase0<Base1>
{
};
class Base2 : public virtual TemplatedBase0<Base2>
{
};
class Derived :
public Base1,
public Base2
{
public:
void f()
{
var = 1; // ERROR: var is ambigous
}
};
我知道在上述情况下,模板化基础 class 是不一样的,即。涉及 2 个完全未实现的基 classes,看起来虚拟继承不起作用。
所以我的问题是,有什么方法可以使它起作用吗? design/approach 我应该带什么来这里?
我需要将基础 class 作为采用派生 class 类型的模板。但是如何让钻石继承成为可能呢?
您的代码中没有钻石。您的 Derived
有两个不同的 var
。根据您的需要写:
Base1::var = 1;
Base2::var = 1;
but how to make diamond inheritance possible?
不清楚您想要钻石的原因。如果您的目标是在 Derived
中只有一个 var
,则需要不同的设计。
如果只想在 Derived
中有一个 int var;
,您需要将其移动到非模板库 class:
class GenericTemplatedBase0
{
protected:
int var = 0;
};
template<typename DERIVED_CLASS>
class TemplatedBase0 : virtual public GenericTemplatedBase0
{
// ...
};
class Base1 : public TemplatedBase0<Base1>
{
};
class Base2 : public TemplatedBase0<Base2>
{
};
class Derived : public Base1, public Base2
{
public:
void f()
{
var = 1;
}
};