首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中,是否可以在子类中使用不同的参数值来扩展参数化基类?

在C++中,是否可以在子类中使用不同的参数值来扩展参数化基类?
EN

Stack Overflow用户
提问于 2010-01-06 05:41:11
回答 5查看 3.4K关注 0票数 0

在我所理解的所有语言中,这是不可能的,但是有人告诉我在C++中这是可能的,但我很难相信它。从本质上讲,当你参数化一个类时,你在编译阶段创建了一个唯一的类,不是吗?

如果我的问题不清楚,请告诉我。

这里是我试图解释我正在尝试做的事情(注意L类):

代码语言:javascript
复制
//; g++ ModifingBaseClassParameter.cpp -o ModifingBaseClassParameter;ModifingBaseClassParameter

#include <iostream>

using namespace std;

template<typename T>
class Base
{
    public:
        Base() {}
        Base(T& t) : m_t(t) {}
        T& getMem() {return m_t;}
    private:
        T m_t;
};

template<typename T>
class F: Base<T>
{};

template<typename T>
class L: F<long>
{};

int main()
{
     Base<int> i;
     F<float> f;
     L<long> l;

     cout<<i.getMem()<<endl;
//     cout<<f.getMem()<<endl; // why doesn't this work
//     cout<<l.getMem()<<endl; // why doesn't this work
}

所以正如你所看到的(希望我的语法是有意义的),类L正试图将它的父类的float参数重新定义为long类型。这看起来当然不合法,但我会与专家们意见不同。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-06 05:48:47

如果你想问你是否可以在c++中做到这一点:

代码语言:javascript
复制
template <> 
class ParamClass<Type1> : public ParamClass<Type2> 
{
};

那么,是的,这是可能的。

它经常被用来定义模板列表或从另一种类型继承特征。

票数 2
EN

Stack Overflow用户

发布于 2010-01-06 07:35:42

您所要求的内容不能直接完成--但您可以通过使用默认模板参数来实现:

代码语言:javascript
复制
template <typename T>
class Base { };

template <typename T = int>
class X : Base<T> {};

class Y : Base<float>

class Z : X<long> {};

在这种情况下,默认模板参数不会添加太多内容。您必须提供模板参数列表来实例化模板,即使所有参数都提供了默认值。因此,在派生类中重写的默认值通常只对第二个和后续参数有用。

票数 2
EN

Stack Overflow用户

发布于 2012-05-15 15:29:51

代码语言:javascript
复制
#include <iostream>
#include <typeinfo>

using namespace std;

template<typename T>
class Base
{
    public:
        Base() {}
        Base(T& t) : m_t(t) {}
        T& getMem() {return m_t;}
    private:
        T m_t;
};

template<typename T>
class F: public Base<T>
{};

template<typename T>
class L: public F<long>
{};

int main()
{
     Base<int> iNTEGER;
     F<float> fLOAT;
     L<long> lONG;

     int x;
     cout << typeid(iNTEGER.getMem()).name() << endl;
     cout << typeid(fLOAT.getMem()).name() <<endl; // this works now :)
     cout << typeid(lONG.getMem()).name() <<endl; // this works now :)
}

默认情况下,继承在c++中是私有的,一旦公开了,除非你想问其他东西,否则stephenmm写的应该是什么?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2009295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档