簡體   English   中英

C ++繼承問題

[英]C++ Inheritance problem

我希望我在這里得到相關的代碼。 當我想獲取添加到menu_1的菜單選項時遇到一些問題。 我使用此函數on_select(int)來獲取一個子菜單的選項,這是通過使用display()函數來完成的。 但是當我編譯它會說在menu_option()類中沒有名為display()的函數,它是Base類,但我想要的是訪問位於sub_menu()類中的display()函數。

我已經嘗試了多種方法來從數組中獲取相關對象,但均未成功,因此我現在在此尋求幫助。

我有以下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;
    }
}

要解決您的直接問題,您需要使用dynamic_castmenu_option*轉換為sub_menu* ,如下所示:

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

請注意,如果menu_option失敗(即list[i]指向的sub_menu畢竟不是sub_menu ),則子菜單指針的值將為NULL,因此請確保在使用它之前先檢查它是否為有效指針。后續代碼。

你可以做你想做的事,但這很糟糕。 在on_select()中調用display()時,您必須向下推至sub_menu。 當然,它無法按您的方式工作,編譯器會告訴您原因。

另一個選項,可能更好(雖然沒有清楚地理解問題空間可能不是最好的 )是將display()作為虛擬函數添加到menu_option類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM