【问题标题】:c++ template inheritance schemec++模板继承方案
【发布时间】:2013-07-21 13:45:08
【问题描述】:

我想知道我的编码方式是否正确。我可以创建一个从模板类继承的模板 claas 吗?如果可以,以下代码是否正确:

template<typename Type>
class A{
    public:
        A(){};
        method_A(){//do whatever}
    protected:
        int a;
}

第二类是:

template<typename Type>
class B:public<Type> A {
    public:
        B(){};
        method_B(){this->a=0; this->method_A();}
    protected:
        int b;
}

我的最后一堂课是:

class C:public<double> B{
    public:
        C(){};
        method_C(){ b = 0; method_B();}
    protected:
        int c;
}

为什么 this-&gt; 在 B 类中是强制性的,而在 C 类中却不是?一般来说,我是否应该始终将this-&gt; 添加到属于同一类的引用参数或方法?

【问题讨论】:

  • 您的意思是A&lt;Type&gt;B&lt;double&gt;
  • 它实际上称为类模板,而不是模板类。这是一个提示,一旦你实例化了一个类模板,它就不再是一个模板,而只是一个类。
  • 请注意,您不能从派生类访问基类中定义的private 成员。将其设为 protected 或使用 getter/setter 函数。
  • method_a() 替换为this-&gt;method_a() 是解决此问题的最直接方法。如果你使用A&lt;T&gt;::method_a(),那么你说的有点不同,因为A&lt;T&gt;::method_a()method_a()是一个虚函数的情况下不会执行动态绑定。

标签: c++ class templates inheritance


【解决方案1】:

这在 C++03 和 C++11 标准的第 14.6.2p3 节中有具体说明:

在类模板或类模板成员的定义中,如果类模板的基类依赖于模板参数,则在非限定名称查找期间不会检查基类范围,无论是在定义点类模板或成员,或在类模板或成员的实例化期间。

【讨论】:

    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 2020-09-21
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多