具有模板化继承的纯虚函数

时间:2017-02-05 22:12:10

标签: c++ templates inheritance

我试图用模板化的派生类实现多态性。见下文:

//templated base class
template <class num> class A{
protected:
    num x;
    num y;

public:
    A( num x0 = 0, num y0 = 0) {
       x = x0;
       y = y0;
    }
    virtual void print_self() = 0;

};

//derived class
template < class num > class B: public A < num > {
   public:
      B( num x1 = 0, num y1 = 0):shape < num > ( x1 , y1 ) { }
      void print_self(){
          std::cout << "x is " << x << " and y is " << y << endl;
      }
};

基类具有纯虚函数print_self()。当尝试在派生类中定义函数时,我收到以下错误:

'x' was not declared in this scope

同样的y。 因此,派生类无论如何都无法访问变量x和y,即使它被列为受保护的。

是否有其他方法来定义print_self(),或者这根本不可能?如果不可能,你能提出另一种方法吗?

1 个答案:

答案 0 :(得分:2)

由于您使用模板化继承,xy的存在取决于模板参数。换句话说,this指针的基类部分成为从属名称。您必须明确使用this指针或使用。

template<typename num>
struct B : A<num> {
    using A<num>::x;
    using A<num>::y;

    void print_self(){
        std::cout << "x is " << x << " and y is " << y << endl;
    }
};

甚至:

template<typename num>
struct B : A<num> {
    void print_self() {
        std::cout << "x is " << this->x << " and y is " << this->y << endl;
    }
};