1

假设我们有两个类:

class Parent
{
public:
   vector<int> x;
protected:
   void Method();
}

class Child : public Parent
{
public:
   vector<double> x;
}

并且该方法Method()进行操作x并进行一些操作,这对两种类型都兼容intdouble

void Parent::Method() 
{ 
    x.push_back(1); 
}

然后,如果我将创建一个Child类的实例,初始化vector<double> x,然后Method()从基类调用派生方法,C++ 将尝试对Parent' 成员x而不是Child' 成员进行操作。有什么方法可以使基类方法自动对属于已创建类的成员进行Child操作vector<int> x

编辑: 正如 McAden 正确指出的那样,这种行为可以使用多态性轻松实现:三个类 - 1 个基类和 2 个派生类。但这是否意味着只有 2 个班级是不可能的?

4

2 回答 2

2

在处理继承时更改数据类型不太可能,但使用协方差的情况除外。如果您想创建一个处理不同数据类型的类,您可能正在寻找一个模板类:

http://www.learncpp.com/cpp-tutorial/143-template-classes/

于 2013-10-01T22:31:15.193 回答
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它当作 trait 类来对待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;
};
于 2013-10-01T22:49:11.893 回答