gpt4 book ai didi

c++ - 具有模板化基类 : Base 的菱形继承(钻石问题)

转载 作者:行者123 更新时间:2023-11-30 03:13:52 25 4
gpt4 key购买 nike

从以派生类作为模板参数的模板化基类继承时,我遇到菱形问题。

通常这个问题可以通过这样的虚拟继承来解决:

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

我知道在上述情况下模板化基类是不一样的,即。涉及 2 个完全未实现的基类,看起来虚拟继承不起作用。

所以我的问题是,有什么方法可以让它发挥作用吗?我应该在这里采用什么设计/方法?

我需要将基类作为采用派生类类型的模板。但如何使菱形继承(钻石问题)成为可能?

最佳答案

如果想在Derived中只有一个int var;,你需要把它移到一个非模板基类中:

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

关于c++ - 具有模板化基类 : Base<Derived> 的菱形继承(钻石问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58367753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com