调用基类方法:访问派生类的成员

时间:2013-10-01 22:28:47

标签: c++ oop inheritance

假设我们有两个班级:

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 ++将尝试对{{1成员Parent而不是x的成员。有没有办法让基类方法自动操作属于创建类的成员Child的{​​{1}}?

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 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;
};