2017-02-05 2 views
2

Я пытаюсь реализовать полиморфизм с шаблоном производного класса. См. Ниже:Чистые виртуальные функции с шаблонным наследованием

//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(), или это просто невозможно? Если это невозможно, можете ли вы предложить другой подход?

+0

Используйте 'this-> x' и' this-> y'. – skypjack

+0

Использование 'this' здесь избыточно. – Raindrop7

+0

Вы также можете использовать 'A :: x' и' A :: y' или 'typedef A base', а затем' base :: x' и т. Д. – DeiDei

ответ

2

Поскольку вы используете шаблонное наследование, существование x и y зависят от аргумента шаблона. Другими словами, часть базового класса указателя 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; 
    } 
}; 
Смежные вопросы