<分区>
将虚拟多重继承(钻石)替换为模板继承(线性)是个好主意吗?例如我有这个类图:
IBase
/ \
/ \
IExtendedBase BaseImpl
\ /
ExtendedImpl
我知道我可以用虚拟继承来实现它。但是我可以使用模板来使这个图表线性化吗?
class IBase
{
public:
virtual std::string name() = 0;
};
template<typename T>
class BaseImpl : public T
{
public:
virtual std::string name() override
{
return "BaseCommonImpl";
}
};
template<typename T>
class IExtendedBase : public T
{
public:
virtual std::string extended_name() = 0;
};
template<typename T>
class ExtendedBaseImpl : public T
{
public:
virtual std::string extended_name() override
{
return "ExtendedBaseImpl";
}
};
现在有了 typedef,我可以特化 ExtendedBase
typedef IExtendedBase<BaseImpl<IBase>> _ExtendedBase;
typedef ExtendedBaseImpl<_ExtendedBase> _ExtendedBaseImpl;
哪种方法更好?虚拟继承还是模板继承?