2010-05-27 232 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 *指針),則會發生災難。