2010-05-27 154 views
1

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

请注意,我必须在很多地方更改“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(); 
     } 
} 

问候 阿伦

+11

通常这意味着你做错了。我会进入更多的细节,但我不会因为我很懒。 – Stephen 2010-05-27 18:54:32

回答

0

使用虚函数在基类:

virtual void chiComponentMethod() = 0; 
0

最简单的方法就是让虚拟功能组件和chiComponent,然后一直使用组件* COM基类指针。

+0

我知道我可以在BSTNode类本身中添加虚拟虚拟函数。但是由于显而易见的原因,这会使BSTNode类变得丑陋。所以我想知道是否有比添加虚拟虚函数更好的解决方案 – arun 2010-05-27 19:18:25

2

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

virtual void componentMethod() = 0;

这将使Component一个抽象类,因此不可实例。

然后在chiComponent你可以有:

virtual void componentMethod() { 
    chiComponentMethod(); 
} 

或者,你可以只重命名chiComponentMethodcomponentMethod,并把实施有直接。

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

而且,我相信,

com = new chiComponent(); 

应该

*com = new chiComponent(); 

因为comComponent *

+1

而'ccom.chiComponentMethod()'应该是'ccom-> chiComponentMethod()' – CuppM 2010-05-27 19:17:16

+0

对,那也是 – danben 2010-05-27 21:39:52

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'** s类型更改为更具体和更有意义的AVLNode类型?

+0

请注意,我不能拥有BSTNode中的纯虚函数,因为我还需要创建BSTNode类型的对象 – arun 2010-05-27 19:15:50

1

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

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

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