您可以尝试在G上进行G2的私有继承,并使用using
公开G的所有功能。因为它是私人的,所以Base<Z>
的所有功能都将被隐藏。通过Base<Z2>
继承,你得到你想要的。唯一的问题是你有两个属性Base<Z>
和Base<Z2>
(例如int x
),所以对象比较大,所以如果这是一个问题,你应该让所有Base<T>
继承类并使用虚拟继承。 (第二文档片断)
template<class T> class Base
{
int x;
T* t;
};
class Z
{
void zfoo() {}
};
class G : public Base<Z>
{
public:
void foo1() {}
};
class Z2 : public Z
{
void zfoo2() {}
};
class G2 : private G, public Base<Z2>
{
public:
using G::foo1;
void newfoo() {}
};
虚拟继承,只有一个int x
最终G2
class TrueBase {
public:
int x;
};
class A :public std::exception
{
public:
};
template<class T> class Base : virtual public TrueBase
{
public:
T* t;
};
class Z
{
void zfoo() {}
};
class G : virtual public Base<Z>
{
public:
void foo1() {}
};
class Z2 : public Z
{
void zfoo2() {}
};
class G2 : private G, virtual public Base<Z2>
{
public:
using G::foo1;
void newfoo() {}
};
您的术语似乎是错误的。在你的问题中没有描述的东西实际上是“专业化”,因为它通常被称为C++模板并且被使用。毫无疑问,每个人都需要使用相同的词汇,才能对问题获得有意义的答案。请使用正确的术语来更改您的问题。如果你真的在专业化,总结一下它的专业化。否则,使用正确的术语 - 继承,实例化等 - 在适当的地方。 –