2013-10-10 10 views
0

Итак, у меня есть 2 класса, а именно book и mainscreen, где book является общедоступным с mainscreen.Как наследовать класс A от B, наследуя B от A?

Теперь я хочу использовать публичные функции членов книги классов через функции-члены главного экрана.

Вот мой код:

class book; 

class mainscreen:virtual public book 
{ 
    protected: 
    int logged; 

    public: 
    void printmenu(); 
    void printhead(); 
    void auth(); 
    void logout(); 
    mainscreen(); 
}; 

class book:public mainscreen 
{ 
    private: 
    int bookno, 
     days, 
     late_days; 
    long double price; 

    float fine_calc(int a,float b) // a -> late days , b -> fine per day 
    { 
    return a*b; 
    } 

    public: 
    book(); //const 
    void input(); 
    void display(); 
    void update(); 
}; 

Вызывающая часть: -

 void mainscreen::printmenu(){ 
    int i; 
    printhead(); 
    cout<<"\n\n\t Choose a Number to perform the corresponding task \n"; 
    cout<<"\n1.Enter a new Book "; 
    cout<<"\n2.Issue a Book "; 
    cout<<"\n3.Return a book" ; 
    cout<<"\n4.Update Information for a book "; 
    cout<<"\n5.Information About books "; 
    cout<<"\n6.Logout "; 

    cout<<"\nEnter your choice: "; 
    cin>>i; 

    menuhandler(i); 

    } 

    void mainscreen::menuhandler(int choice){ //the no of choice selected 

    switch(choice) 
    { 
    case 1:  printhead(); 
     input(); 

    case 2:  printhead(); 
     issuebook();   

    case 3:  printhead(); 
     returnbook();    

    case 4:  printhead(); 
     update(); 

    case 5:  printhead(); 
     display(); 

    case 6:  logout();      

    default: 
     cout<<"Invalid Choice! Press Return to Try again. "; 
     getch(); 
     printmenu();      // Reset to menu 



    } 


    } 

Когда я пытаюсь использовать функции-члены класса book в функции члена mainscreen, я получаю следующее ошибка: call to undefined function.

+2

тот факт, что вы можете сделать, это не значит, что это хорошая идея! Существует хорошая причина, почему C# и java не позволяют этого. Пожалуйста, рассмотрите редизайн – lordkain

+4

Наследование предполагается моделировать * is-a * отношения. Но книга не является главным экраном, и ни один из них не является основным экраном книги. Наследование - неправильный инструмент для проблемы, которую вы пытаетесь решить. – us2012

+0

Это просто невозможно! Чего вы хотите достичь? –

ответ

4

У вас есть:

  • определен две сущности (классы): Book и MainScreen
  • , а затем вы определили общее поведение и атрибуты этих классов

Но вы пришли с очень неправильным выводом , что эти классы должны наследовать друг от друга (т. е. предоставлять некоторое поведение/атрибуты друг другу). Вместо этого вы должны создать третий класс, который эти классы наследуют (независимо от того, из чего они предназначены для общего).

Возможный подход интерфейс на основе может быть, например:

class Displayable { 
public: 
    virtual void display(); 
}; 

class Book : public Displayable { 
    ... 
}; 

class MainScreen : public Displayable { 
    ... 
}; 
Смежные вопросы