假设我有一个类Base,它有一个成员变量A * my_hash。 我还有类继承自类Base的类。我也有B级 它扩展了A。
class Base{
Base(): my_hash(new A) {}
//methods which use my_hash
protected:
A* my_hash;
};
class Extended:public Base{
//methods which use my_hash from A
//I cannot have a B* my_other_hash in this class
//I would like to substitute B* my_hash
//I cannot let Base create my_hash (of type A*) because that is not what I want.
};
我希望Extended能够做到平常(即使用从A继承的所有东西),除了 并且有一个重要的区别,我希望my_hash是B *而不是A * 每当某些东西通过Extended的方法或Base的方法访问my_hash时, 我希望执行的方法是B *。
尝试一件事: 我没有方法调用(例如Base()中的create_hash())我在Extended中重新定义。 这不起作用,因为在创建哈希时似乎无法返回到扩展类。
我不希望Base甚至知道B.我该怎么做?
答案 0 :(得分:4)
如果'B'的类型扩展'A',那么您可以设置它以便通过构造函数传递'm_hash'的值(您也可以将此构造函数隐藏为受保护的代码,以便不继承来自'基地'不能延长它。)
e.g。
class Base{
Base(): my_hash(new A) {}
//methods which use my_hash
protected:
A* my_hash;
Base(A* hash): my_hash(hash) {}
};
class Extended:public Base{
public:
Extended() : Base(new B) {}
};
另外,如果你想要'B'中的新专用函数可以从'Extended'调用,那么你可以将它存储在另一个指针中,或者只是将'my_hash'转换为'B *'。
答案 1 :(得分:2)
您可以将Base类变为A:
上的模板template<typename T>
class Base{
Base(): my_hash(new T) {}
//methods which use my_hash
protected:
T* my_hash;
};
class Extended:public Base<B>{
...
};
答案 2 :(得分:0)
按照Autopulated的建议,模板可能就是这里的方法。另一种方法是事实上有一个B * my_other_hash(就像你在问题中提到的那样),然后在B的ctor中将my_other_hash设置为my_hash。
class Extended:public Base{
ExtendedBase(): Base() {
my_other_hash = my_hash;
}
}
然后您可以访问Base中的A方法和Extended中的A或B方法。确保只删除其中一个!如果您在其他地方管理内存,则在Base的dtor或层次结构之外。