在C++中从基类访问子数据

在C++中从基类访问子数据,c++,inheritance,C++,Inheritance,在我的头脑中/在纸上经历了多次迭代,我不确定这个场景的最佳或最正确的方式是什么 设置: 我有一个a级的课程。我不能改变这门课。这个类有几个公共方法。 我编写了类“B”,它将许多类“A”作为一个类进行控制,使用相同的方法名使A和B在代码中可互换。 我现在想写一个类“C”,它可以接受一个类“a”或类“B”,或者将来使用相同的公共方法执行更复杂的操作的另一个类。 我试图通过编写一个超类“D”来实现这一点,使其具有公共操作,而“C”可以继承“D”并提供所需的可变类型。但是“D”无法看到“C”私有变量 我

在我的头脑中/在纸上经历了多次迭代,我不确定这个场景的最佳或最正确的方式是什么

设置:

我有一个a级的课程。我不能改变这门课。这个类有几个公共方法。 我编写了类“B”,它将许多类“A”作为一个类进行控制,使用相同的方法名使A和B在代码中可互换。 我现在想写一个类“C”,它可以接受一个类“a”或类“B”,或者将来使用相同的公共方法执行更复杂的操作的另一个类。 我试图通过编写一个超类“D”来实现这一点,使其具有公共操作,而“C”可以继承“D”并提供所需的可变类型。但是“D”无法看到“C”私有变量

我肯定我只是在想这个结构是错误的,所以在这里,如何正确地使用继承就成了问题。假设D类现在知道C类的类型,我不能强制施法。D也将有很多函数需要使用“o”,我试图避免为每个潜在的类类型重新实现它们中的每一个

我也确信这是一个常见的问题,但我已经寻找了两天的答案了

简化示例代码:

// Class A has been provided to me, and cannot be modified.
#include <classA.h>

class B {
  public:
    B(A *x, int num): z(x), n(num) {};

  int num(void) {return n;};
  // Other methods to operate on objects of class A as if they were a single
  // one, using same method names. Maybe somehow inheritance is better here?

  private:
    A *z;
    int n;
};


class D {
  public:
    D(void): s(5) {};

  // 'o' to be provided by child class, must have method 'num'
  void doThat(void) {return s+o.num();};  

  private:
    int s;
};

// So we can handle multiple types of devices that have the same public methods
// This is just a class to get the private object that superclass D will need
class C: public D {
  public:
    C(B *h): o(h) {};

  private:
    B *o;
};

A ar[2] = { A(1), A(2) };
B l(ar, 2);
C j(&l);

我在新的很多年后回到C++,所以我也愿意接受我现在不正确地解决这个问题。

< p>你可以使用模板为d

template<typename T>
class D:
{
    D(const T* t): m_t(t) {};
    int doThat(void) { return m_t->num(); };

private:
    T* m_t;
}

A ar[2] = { A(1), A(2) };
B l(ar, 2);
C<B> j(&l);

您可以使用D的模板

template<typename T>
class D:
{
    D(const T* t): m_t(t) {};
    int doThat(void) { return m_t->num(); };

private:
    T* m_t;
}

A ar[2] = { A(1), A(2) };
B l(ar, 2);
C<B> j(&l);

你遗漏了太多细节。请写一个。你会发现。你遗漏了太多的细节。请创建一个。您将发现。模板是本例中缺少的链接。自从我在C++工作了这么久,我就忘记了所有这些。完美的例子,你所遇到的问题实际上并不是你所遇到的问题。谢谢在本例中,模板是缺少的链接。自从我在C++工作了这么久,我就忘记了所有这些。完美的例子,你所遇到的问题实际上并不是你所遇到的问题。谢谢
class D {
public:
  D(): s(5) {} 
  // Your child class must overload getter method getNum() 
  int doThat() {
     return s + getNum();
   }
private:
  int s;
  // pure virtual, must be overload
  virtual int getNum() = 0; 
...
};

class C : public D {
private:
  B* o;
   // overload pure func
  int getNum() override {
    return o->num();
  }
public:
  // Use default D ctor
  C(B* b) : D(), o(b) {}
...  
};

A ar[2] = { A(1), A(2) };
B l(ar, 2);
C j(&l);
j.doThat(); // return 5 + ar->num