[英]Base Class method accessing Derived Class members
我有以下情况:
class num {
public:
void print(ostream* o); // Prints the n variable
};
class int_num : public num{
public:
int n; // Initialized by this class's constructor
};
class float_num : public num{
public:
float n; // Initialized by this class's constructor
};
class double_num : public num{
public:
double n; // Initialized by this class's constructor
};
我如何实施这样的计划
给它一个虚拟方法,将在派生类型中实现:
class num {
public:
void print(ostream& o) const
{ // Prints the n variable
doPrint(o);
}
private:
virtual void doPrint(ostream& os) const = 0;
};
class double_num : public num{
public:
double n; // Initialized by this class's constructor
private:
void doPrint(ostream& os) const
{
os << n;
}
};
为什么不使用template
:
template<typename T>
class num
{
T n; //data of type T
public:
//add constructor(s) to initialize n
void print(std::ostream &out) { out << n ; }
//add functions(s) to work with n
};
这样就可以进行打印了。
现在,您有两个选择:
如果代码中所有派生类型都在做相同的事情,而没有特定于类型的信息,请使用typedef
:
//use typedefs typedef num<int> int_num; typedef num<float> float_num; typedef num<double> double_num;
如果需要在派生类中键入特定内容,请使用继承:
class int_num : public num<int> { //int specific things };
关键是num<T>
可以执行打印,而不管您使用typedef
还是继承 。
您有两个选择。
正如其他人已经指出的那样,一种方法是使print()
纯为虚拟,并在派生类中实现它。
另一个选择是使用“ 好奇地重复发生”模板模式 ,如下所示:
template <typename Impl>
class num
{
public:
void print(ostream &os) const
{
os << static_cast<const Impl*>(this)->n;
}
};
class int_num : public num<int_num>
{
//same as before
};
class float_num : public num<float_num>
{
//same as before
};
//etc.
有两种解决方案。 首先是使print
方法成为纯抽象方法,并在所有子类中实现它。 第二种是使用模板:
template<typename T>
class num
{
public:
void print(std::ostream& os) const
{
os << num_;
}
private:
T num_;
};
typedef num<float> float_num;
typedef num<int> int_num;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.