我有一个与C ++继承相关的问题。我有一组像这样的类(我没有给出完整的类结构因为我很懒:))。我想使用com指针访问chiComponent类的公共方法。我该怎么办呢?
请注意,我必须在很多地方更改“com”指向的对象。 所以我认为我不能有另一个
chiComponent *ccom = <some_cast> com;
ccom.chiComponentMethod()
我应该怎么做?
class Component{
};
class chiComponent : public Component {
public:
void chiComponentMethod()
{
cout << "Hi! Chi component function called!!";
}
}
class parent {
protected:
Component *com;
};
class child : public parent{
public:
child() {
com = new chiComponent();
}
}
此致 阿伦
答案 0 :(得分:2)
您需要在Component
中实现纯虚方法;比方说,componentMethod()
:
virtual void componentMethod() = 0;
这将使Component
成为一个抽象类,因此是不可实现的。
然后在chiComponent
你可以:
virtual void componentMethod() {
chiComponentMethod();
}
或者,您可以将chiComponentMethod
重命名为componentMethod
并直接将实施内容放在那里。
此外,Component
的任何进一步实现都可以实现自己的功能。
另外,我相信
com = new chiComponent();
应该是
*com = new chiComponent();
因为com
是Component *
。
答案 1 :(得分:1)
AVL树在某种意义上是一种BST树,它支持所有BST树操作,并且还可以提供更多。所以乍一看从BSTTree派生出AVLTree是有意义的。但是BSTTree依赖于内部类BSTNode,这不足以提供所有AVLTree功能。
如果从BSTNode派生AVLNode,则有两个选项。您可以更改BSTNode以支持超类所需的所有功能,但它没有多大意义。从一开始就设计节点类更好,它支持两种类型的尝试的所有功能。
另一个选项是使所有BSTTree公共方法虚拟化,并在AVLTree类的所有方法实现中将节点显式转换为AVLNode。你想让这些方法成为虚拟的。否则,如果有人使用BSTTree接口来操纵AVLTree的实际实例(例如,指向AVLTree实例的BSTTree *指针),则会发生灾难。
答案 2 :(得分:0)
在基类中使用虚函数:
virtual void chiComponentMethod() = 0;
答案 3 :(得分:0)
最简单的方法是在Component和chiComponent中创建虚函数,然后始终使用Component * com基类指针。
答案 4 :(得分:0)
可能我会更准确地解释这个问题。
我正在尝试用C ++编写AVL树,我正在从BST(二叉搜索树)类扩展AVL类。我还有两个班级
class BSTNode {
protected:
int data;
class BSTNode *left, *right;
};
class AVLNode : public BSTNode{
int height;
};
BST类使用BSTNode,AVL类使用AVLNode。 我正在使用BST类服务进行顺序遍历等操作。 对于插入和删除,我使用AVL类函数(通过虚函数)。
由于显而易见的原因,我有一个 BST类中的 BSTNode * root 。每当我插入,删除等时,根都会改变。 在AVL类中有没有简单的方法将** root'**类型更改为更具体,更有意义的AVLNode类型?