2017-08-04 87 views
0

我有一个设计问题。我有一个G级是从使用模板类基地和Z类生成的Base类继承:如何从类继承而不是从模板类生成的类继承并更改模板类

class G : public Base<Z> 

现在我想创建一个新的类G2是一样的g,但拥有更多一些方法。这些方法取决于从Z继承的类Z2的属性和方法。基本上,我想添加一些方法到G2和Z2,但不是G或Z.

现在我唯一的想法是解决这个问题就是模板G类。我觉得,由于Z2继承自Z,所以应该有一个更聪明的方法来做到这一点。

有没有什么办法可以实现这个功能,而不需要模板化类G或者复制粘贴代码?

+0

您的术语似乎是错误的。在你的问题中没有描述的东西实际上是“专业化”,因为它通常被称为C++模板并且被使用。毫无疑问,每个人都需要使用相同的词汇,才能对问题获得有意义的答案。请使用正确的术语来更改您的问题。如果你真的在专业化,总结一下它的专业化。否则,使用正确的术语 - 继承,实例化等 - 在适当的地方。 –

回答

0

您可以尝试在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() {} 
};