首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++继承问题

C++继承问题
EN

Stack Overflow用户
提问于 2010-11-24 03:48:33
回答 2查看 221关注 0票数 0

我希望我在这里有相关的代码。当我想要获取添加到menu_1中的菜单选项时,我遇到了一些问题。我有一个用来获取一个子菜单选项的函数on_select(int),这是通过使用display()函数来实现的。但是当我编译它时,它会告诉我在menu_option()类中没有名为display()的函数,但我想要的是访问位于sub_menu()类中的display()函数。

我已经尝试了多种方法来从数组中获取相关的对象,但都没有成功,所以我现在在这里请求帮助。

我有以下main()

代码语言:javascript
复制
#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;
    }

头文件

代码语言:javascript
复制
#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;

};

实现文件

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-24 03:55:36

你可以做你想做的事,但这很糟糕。在on_select()中调用display()时,必须向下转换为sub_menu。当然,它不会以你所拥有的方式工作,编译器会告诉你确切的原因。

另一种可能更好的选择(尽管不清楚问题空间可能不是最好的)是将display()作为一个虚函数添加到menu_option类中。

票数 1
EN

Stack Overflow用户

发布于 2010-11-24 03:53:21

要解决当前的问题,您需要使用dynamic_castmenu_option*转换为sub_menu*,如下所示:

代码语言:javascript
复制
sub_menu* submenu(dynamic_cast<sub_menu*>(list[i]));

请注意,如果强制转换失败(即,list[i]指向的menu_option毕竟不是sub_menu ),则子菜单指针的值将为空,因此在后续代码中使用它之前,请确保检查它是否为有效指针。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4260182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档