Вопрос о наследовании C ++ - PullRequest
1 голос
/ 27 мая 2010

У меня есть вопрос, связанный с наследованием C ++. У меня есть набор классов, подобных этому (я не дал полную структуру классов, потому что я ленивый :)). Я хочу получить доступ к открытым методам класса chiComponent, используя com указатель. Как я должен идти об этом?

Обратите внимание, что мне приходится менять объект, на который указывает "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();
        }   
}

С уважением Arun

Ответы [ 5 ]

2 голосов
/ 27 мая 2010

Вам нужно будет реализовать чисто виртуальный метод в Component; скажем, componentMethod():

virtual void componentMethod() = 0;

Это сделает Component абстрактным классом и, следовательно, нереализуемым.

Тогда в chiComponent вы можете иметь:

virtual void componentMethod() {
  chiComponentMethod();
}

В качестве альтернативы, вы можете просто переименовать chiComponentMethod в componentMethod и поместить туда реализацию напрямую.

Кроме того, любые дальнейшие реализации Component могут реализовывать свои собственные функции.

Кроме того, я считаю, что

com = new chiComponent();

должно быть

*com = new chiComponent();

, поскольку com является Component *.

1 голос
/ 27 мая 2010

AVL-дерево является типом BST-дерева в том смысле, что оно поддерживает все операции с BST-деревом и, кроме того, может предоставить еще несколько. Таким образом, на первый взгляд имеет смысл извлечь AVLTree из BSTTree. Но BSTTree опирается на внутренний класс BSTNode, которого недостаточно для обеспечения всех функциональных возможностей AVLTree.

Если вы извлекаете AVLNode из BSTNode, есть две опции. Вы можете изменить BSTNode для поддержки всех функций, которые нужны суперклассу, но это не имеет особого смысла. Лучше просто с самого начала спроектировать класс узла, который поддерживает все функциональные возможности для обоих типов попыток.

Другой вариант - сделать все открытые методы BSTTree виртуальными и явно привести узел к AVLNode во всех реализациях этих методов для класса AVLTree. Вы все равно хотите сделать эти методы виртуальными. В противном случае, если кто-то использует интерфейс BSTTree для управления фактическим экземпляром AVLTree (имеющим, например, указатель BSTTree *, указывающий на экземпляр AVLTree), произойдут бедствия.

0 голосов
/ 27 мая 2010

Может быть, я объясню проблему более точно.

Я пытаюсь кодировать деревья AVL в C ++ и расширяю класс AVL из класса BST (Binary Search Tree). У меня также есть еще два класса

class BSTNode {
protected:
int data;
class BSTNode *left, *right;
};

class AVLNode : public BSTNode{
int height;
};

BST класс использует BSTNode, а AVL класс использует AVLNode. Я использую услуги класса BST для таких вещей, как обход inorder и т. Д. Для вставки и удаления я использую функции класса AVL (через виртуальные функции).

По понятным причинам у меня BSTNode * root в классе BST. Корень меняется всякий раз, когда я делаю вставку, удаление и т. Д. В классе AVL есть ли простой способ изменить тип ** root'а на более конкретный и более значимый тип AVLNode?

0 голосов
/ 27 мая 2010

Самый простой способ - создать виртуальные функции в Component и chiComponent, а затем всегда использовать указатель базового класса Component * com.

0 голосов
/ 27 мая 2010

Использование виртуальных функций в базовом классе:

virtual void chiComponentMethod() = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...