简体   繁体   中英

C++ Inheritance problem

I hope I got the relevant code in here. I have some problem when I want to fetch the menu option that I've added into to menu_1 . I have this function on_select(int) that I use to fetch one sub-menu's options, which I do by using the display() function. But when I compile it will say that there are no function named display() in menu_option() class, which is the Base class, but what I want to is to access the display() function which is located in the sub_menu() class.

I have tried multiple thing to get the relevant object from the array without any success, so I'm here now asking for help with this one.

I have this following 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;
    }

header file

#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;

};

implement file

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;
    }
}

To solve your immediate problem you'll want to use dynamic_cast to turn a menu_option* into a sub_menu* , like so:

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

Note that if the cast fails (ie, the menu_option pointed to by list[i] is not a sub_menu after all) the value of the submenu pointer will be NULL, so make sure you check that it is a valid pointer before using it in subsequent code.

You can do what you want to do, but it's bad. You have to cast down to sub_menu when you call display() in on_select(). Of course it's not going to work the way you have it, and the compiler is telling you exactly why.

The other option, which is probably better (though without a clear understanding of the problem space may not be the best ) would be to add display() as a virtual function to the menu_option class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM