我有一个这样的课程:
class A {
protected:
class Node {
public:
int x;
Node* next;
};
Node* root;
.
.
.
};
很多方法都使用了这个" root"。
现在,假设我想继承A类,并使所有方法都使用"更好"节点。类似的东西:
class B : public A{
class NewNode : public A::Node{
public:
int y;
};
NewNode* root;
.
.
.
};
有没有办法做这样的事情?如果没有,除了重写A类之外还有哪些替代方案?
谢谢!
答案 0 :(得分:0)
如果A是抽象的,则可以独立于任何派生类来编译和使用它的所有方法。因此,访问此变量的代码将已生成且无法更改。我认为如果不修改A,就没有办法做你想做的事。
虽然,这取决于一点,你究竟是什么意思。如果NewNode派生自Node并且Node具有虚函数,则A当然会调用NewNode的方法。如果您不希望从Node派生NewNode,您可能必须使A成为模板类。如果A直接访问Node的成员,而不是使用虚拟Getter / Setter-Functions,这也可以。
答案 1 :(得分:0)
由于NewNode
派生自Node
,您可以在B
构造函数中添加类似的内容
delete root; //remove the Node
root = new NewNode(); //and put in the better one
更现实地说,你可能需要这样的东西
Node * oldRoot = root;
root = new NewNode(oldRoot);
delete oldRoot;
您不需要在B中使用新变量,只需使用A::root
。