C ++继承问题

时间:2010-05-27 18:50:03

标签: c++ inheritance

我有一个与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();
        }   
}

此致 阿伦

5 个答案:

答案 0 :(得分:2)

您需要在Component中实现纯虚方法;比方说,componentMethod()

virtual void componentMethod() = 0;

这将使Component成为一个抽象类,因此是不可实现的。

然后在chiComponent你可以:

virtual void componentMethod() {
  chiComponentMethod();
}

或者,您可以将chiComponentMethod重命名为componentMethod并直接将实施内容放在那里。

此外,Component的任何进一步实现都可以实现自己的功能。

另外,我相信

com = new chiComponent();

应该是

*com = new chiComponent();

因为comComponent *

答案 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类型?