【问题标题】:Call to base class method: accessing member of derived class调用基类方法:访问派生类的成员
【发布时间】:2013-10-08 06:08:36
【问题描述】:

假设我们有两个类:

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&lt;double&gt; x,然后从基类调用派生方法Method(),C++会尝试对Parent的成员x进行操作而不是Child 的那个。有什么办法可以让基类方法自动对属于创建类的成员Childvector&lt;int&gt; x进行操作?

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

【问题讨论】:

  • 你真的希望Child 有两个向量,还是你真的打算只有一个向量?
  • 我只创建Child-type 对象并且只想要Child 的向量

标签: c++ oop inheritance


【解决方案1】:

由于您只想创建Child 的实例,并且希望Child 指示向量的类型,因此使用模板Parent 可以更自然地解决此问题。举个简单的例子,Parent 可以通过 vector&lt;&gt; 应该包含的内容来参数化:

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

【讨论】:

  • 谢谢!什么是T是类之类的复杂类型?
  • 如果您在谈论代码的第一个示例,如果T 很复杂,那么尝试使用Method() 可能会失败,除非从int 转换为@987654338 类@.
【解决方案2】:

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

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

【讨论】:

  • 是的,你需要使用虚函数来允许多态性
  • @McAden,是的,你是对的——我想要的行为可以用三个类来实现——一个基类和两个派生类。但我想看看是否有可能只用 2 节课。谢谢
  • 如果x的类型和上例不同怎么办?
  • 没注意到你要这么做。除了协方差,没有。
  • x 是成员变量,Method 是无效的
猜你喜欢
  • 2012-09-16
  • 1970-01-01
  • 2021-12-05
  • 2017-09-30
  • 2019-01-20
  • 1970-01-01
  • 2011-01-27
  • 2015-02-04
  • 2012-08-29
相关资源
最近更新 更多