Проблема наследования C ++ - PullRequest
0 голосов
/ 23 ноября 2010

Я надеюсь, что получил соответствующий код здесь.У меня возникла проблема, когда я хочу выбрать пункт меню, который я добавил в menu_1.У меня есть эта функция on_select(int), которую я использую, чтобы выбрать опции одного подменю, что я делаю с помощью функции display().Но когда я скомпилирую, он скажет, что в классе menu_option (), который является базовым классом, нет функции с именем display (), но я хочу получить доступ к функции display (), которая находится в классе sub_menu ().

Я несколько раз пытался получить соответствующий объект из массива без какого-либо успеха, поэтому сейчас я прошу помощи с этим.

У меня есть следующее main ()

#include <iostream>

using namespace std;

    #include "menu.h"

    int main()
    {


        sub_menu* main_menu = new sub_menu("Warehouse Store Menu");

        sub_menu* menu_1 = new sub_menu("Menu1");

        main_menu->add_option(new sub_menu("Menu2"));
        main_menu->add_option(menu_1);

        product_menu->add_option(new add_item("sub_item1"));
        product_menu->add_option(new add_item("sub_item2"));
        product_menu->add_option(new add_item("sub_item3"));  

        main_menu->display();
        main_menu->on_select(1);

        delete main_menu;

        return 0;
    }

файл заголовка

#include <iomanip>
#include <iostream>
#include <string>
using namespace std;

const int MAX_SIZE = 9;

class menu_option
{
public:
    menu_option(string const& n) : title(n) {};
    virtual ~menu_option();

    virtual void on_select(int) = 0;
    string get_title() { return title; }
protected:
    string title;
};


/* ------------------------------------- */
class sub_menu : public menu_option
{

public:
    sub_menu(string const& n)
        : menu_option(n) { no_item = 0; }

    ~sub_menu() { delete[] list; };

    void on_select(int);

    void add_option(menu_option*);
    void display();

private:
    menu_option* list[MAX_SIZE];   //container for options in the sub_menu
    int no_item;

};

файл агрегата

void sub_menu::on_select(int i)
{
    cout << (list[i])->get_title() << endl;
    cout << (list[i])->display() << endl; //<------ Doesn't work
}

void sub_menu::add_option(menu_option* item)
{
    list[no_item] = item;
    no_item++;
}

void sub_menu::display()
{
    cout << ">> " << get_title() << " <<"<< endl;
    for( int i = 0; i < no_item; i++ )
    {
       cout << setw(2) << i << ": " << (list[i])->get_title() << endl;
    }
}

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Ты можешь делать то, что хочешь, но это плохо.При вызове display () в on_select () вы должны перейти к sub_menu.Конечно, это не сработает так, как у вас, и компилятор скажет вам точно, почему.

Другой вариант, который, вероятно, лучше (хотя без четкого понимания проблемного пространства может не быть best ) - добавить display () как виртуальную функцию в класс menu_option.

1 голос
/ 23 ноября 2010

Чтобы решить вашу непосредственную проблему, вы захотите использовать dynamic_cast, чтобы превратить menu_option* в sub_menu*, например:

sub_menu* submenu(dynamic_cast<sub_menu*>(list[i]));

Обратите внимание, что если произойдет сбой приведения (т. Е. menu_option, на который указывает list[i], в конце концов, не является sub_menu), значение указателя подменю будет равно NULL, поэтому убедитесь, что оно является действительный указатель перед использованием его в последующем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...