我试图用模板化的派生类实现多态性。见下文:
//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 :(得分: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;
}
};