在C++中从基类访问子数据
在我的头脑中/在纸上经历了多次迭代,我不确定这个场景的最佳或最正确的方式是什么 设置: 我有一个a级的课程。我不能改变这门课。这个类有几个公共方法。 我编写了类“B”,它将许多类“A”作为一个类进行控制,使用相同的方法名使A和B在代码中可互换。 我现在想写一个类“C”,它可以接受一个类“a”或类“B”,或者将来使用相同的公共方法执行更复杂的操作的另一个类。 我试图通过编写一个超类“D”来实现这一点,使其具有公共操作,而“C”可以继承“D”并提供所需的可变类型。但是“D”无法看到“C”私有变量 我肯定我只是在想这个结构是错误的,所以在这里,如何正确地使用继承就成了问题。假设D类现在知道C类的类型,我不能强制施法。D也将有很多函数需要使用“o”,我试图避免为每个潜在的类类型重新实现它们中的每一个 我也确信这是一个常见的问题,但我已经寻找了两天的答案了 简化示例代码:在C++中从基类访问子数据,c++,inheritance,C++,Inheritance,在我的头脑中/在纸上经历了多次迭代,我不确定这个场景的最佳或最正确的方式是什么 设置: 我有一个a级的课程。我不能改变这门课。这个类有几个公共方法。 我编写了类“B”,它将许多类“A”作为一个类进行控制,使用相同的方法名使A和B在代码中可互换。 我现在想写一个类“C”,它可以接受一个类“a”或类“B”,或者将来使用相同的公共方法执行更复杂的操作的另一个类。 我试图通过编写一个超类“D”来实现这一点,使其具有公共操作,而“C”可以继承“D”并提供所需的可变类型。但是“D”无法看到“C”私有变量 我
// 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>你可以使用模板为dtemplate<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