首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++继承问题

C++继承问题
EN

Stack Overflow用户
提问于 2010-05-28 02:50:03
回答 5查看 220关注 0票数 1

我有一个与C++继承相关的问题。我有一组这样的类(我没有给出完整的类结构,因为我很懒:)。我想使用com指针访问chiComponent类的公共方法。我该怎么做呢?

请注意,我必须在很多地方更改"com“所指向的对象。所以我想我不能再要一个了

代码语言:javascript
复制
chiComponent *ccom = <some_cast> com;
ccom.chiComponentMethod()

我该怎么做呢?

代码语言:javascript
复制
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();
        }   
}

关于Arun

EN

回答 5

Stack Overflow用户

发布于 2010-05-28 02:56:20

您将需要在Component中实现一个纯虚拟方法;比如componentMethod()

virtual void componentMethod() = 0;

这将使Component成为一个抽象类,因此无法实例化。

然后,在chiComponent中,您可以拥有:

代码语言:javascript
复制
virtual void componentMethod() {
  chiComponentMethod();
}

或者,您可以将chiComponentMethod重命名为componentMethod,并将实现直接放入其中。

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

另外,我相信

代码语言:javascript
复制
com = new chiComponent();

应该是

代码语言:javascript
复制
*com = new chiComponent();

因为com是一个Component *

票数 2
EN

Stack Overflow用户

发布于 2010-05-28 03:38:39

在某种意义上,AVL树是BST树的一种类型,它支持所有的BST树操作,并且另外可以提供更多。所以乍一看,从BSTTree派生AVLTree是有意义的。但是BSTTree依赖于内部类BSTNode,这不足以提供所有的AVLTree功能。

如果从BSTNode派生AVLNode,则有两种选择。您可以更改BSTNode以支持超类所需的所有功能,但这没有多大意义。最好从一开始就设计节点类,它支持两种类型的尝试的所有功能。

另一种选择是使所有BSTTree公共方法都是虚的,并在AVLTree类的这些方法的所有实现中显式地将节点强制转换为AVLNode。不管怎样,你都想让这些方法成为虚拟的。否则,如果有人使用BSTTree接口来操作AVLTree的实际实例(例如,有一个指向AVLTree实例的BSTTree*指针),灾难就会发生。

票数 1
EN

Stack Overflow用户

发布于 2010-05-28 02:55:45

在基类中使用虚函数:

代码语言:javascript
复制
virtual void chiComponentMethod() = 0;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2923960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档