【问题标题】:How to inherit from a class than inherits from a class generated by a template class and change the template class如何从类继承而不是从模板类生成的类继承并更改模板类
【发布时间】:2017-08-04 10:57:14
【问题描述】:

我有一个设计问题。我有一个类 G 继承自使用模板类 Base 和类 Z 生成的类 Base :

class G : public Base<Z>

现在我想创建一个新类 G2,它与 G 相同,但拥有更多方法。这些方法依赖于从 Z 继承的类 Z2 的属性和方法。基本上,我想向 G2 和 Z2 添加一些方法,而不是向 G 或 Z 添加一些方法。

目前我对如何解决这个问题的唯一想法是将类 G 模板化。我觉得,既然 Z2 继承自 Z,应该有一个更聪明的方法来做到这一点。

有什么方法可以在不模板化 G 类或复制粘贴代码的情况下实现这一点?

【问题讨论】:

  • 您的术语似乎有误。您的问题中描述的任何内容实际上都不是“专业化”,因为它众所周知并与 C++ 模板一起使用。不言而喻,每个人都需要使用相同的词汇,才能得到一个有意义的问题答案。请使用正确的术语重新表述您的问题。如果您实际上是专攻某事,请总结一下它是如何专攻的。否则,请在适当的地方使用正确的术语——继承、实例化等。

标签: c++ templates inheritance


【解决方案1】:

您可以尝试在 G 上对 G2 进行私有继承,并使用 using 公开 G 的所有功能。 Base&lt;Z&gt; 的所有功能都将被隐藏,因为它是私有的。继承Base&lt;Z2&gt;,你就会得到你想要的。唯一的问题是你同时拥有Base&lt;Z&gt;Base&lt;Z2&gt; 的属性(例如int x),所以对象更大,所以如果有问题你应该让所有Base&lt;T&gt; 继承自TrueBase 类和使用虚拟继承。 (第二次剪断)

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() {}
};

虚拟继承,最终G2只有一个int x

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() {}
};

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多