假设我们有两个班级:
class Parent
{
public:
vector<int> x;
protected:
void Method();
}
和
class Child : public Parent
{
public:
vector<double> x;
}
并且方法Method()
对x
进行操作并进行一些操作,这对int
和double
两种类型都兼容:
void Parent::Method()
{
x.push_back(1);
}
然后,如果我将创建Child
类的实例,初始化vector<double> x
,然后从基类调用派生方法Method()
,C ++将尝试对{{1成员Parent
而不是x
的成员。有没有办法让基类方法自动操作属于创建类的成员Child
的{{1}}?
修改 正如McAden正确指出的那样,使用多态性可以很容易地实现这种行为:三个类--1个基数和2个派生。但这是否意味着只有2个班级是不可能的?
答案 0 :(得分:2)
在处理继承时更改数据类型并不是那么可能,除了使用协方差的情况。如果你想创建一个处理不同数据类型的类,你可能正在寻找的是一个模板类:
答案 1 :(得分:2)
由于您只想创建Child
的实例并希望Child
指示向量的类型,因此使用模板Parent
可以更自然地解决此问题。举个简单的例子,Parent
可以通过vector<>
应该包含的内容进行参数化:
template <typename T>
class Parent {
public:
std::vector<T> x;
protected:
void Method () { x.push_back(1); }
};
class Child : public Parent<double> {
//...
};
如果您确实希望孩子在Parent
中控制很多这样的事情,那么您可能应该将Child
更像Parent
的特征类。因此,Parent
实际上会通过其Child
进行参数化,然后您的代码将使用CRTP。它提供了“静态多态性”。
template <typename CHILD>
class Parent {
protected:
void Method () {
CHILD *child = static_cast<CHILD *>(this);
child->x.push_back(1);
}
};
class Child : public Parent<Child> {
public:
std::vector<double> x;
};