如何在从 A 继承 B 的同时从 B 继承 A 类? [关闭]

Posted

技术标签:

【中文标题】如何在从 A 继承 B 的同时从 B 继承 A 类? [关闭]【英文标题】:How to inherit class A from B while inheriting B from A? [closed] 【发布时间】:2013-10-10 11:28:18 【问题描述】:

所以我有两个类,即bookmainscreen,其中book 公开继承自mainscreen

现在我想通过主屏幕的成员函数来使用课本的公共成员函数。

这是我的代码:

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



     


     

当我尝试在 mainscreen 的成员函数中使用类 book 的公共成员函数时,我收到以下错误:调用未定义函数

【问题讨论】:

您可以做到这一点并不意味着这是一个好主意! c# 和 java 不允许这样做是有充分理由的。请考虑重新设计 继承应该模拟 is-a 关系。但是一本书不是主屏幕,主屏幕也不是一本书。对于您要解决的问题,继承是错误的工具。 继承对 is-a 关系建模。如果bookmainscreen,反之亦然,那么它们就是一个类。如果这不能回答您的问题,那么您需要更好地解释您要解决的问题。 哪个编译器允许这个class book; class mainscreen:virtual public book??根据 [class.derived]/2 “由 base-type-specifier 表示的类型应是不是未完全定义的类的类类型”(我倾向于说扔掉那个编译器) 只是因为它是家庭作业并不意味着你应该做错。 【参考方案1】:

你有:

标识了两个实体(类):BookMainScreen 然后您确定了这些类的常见行为和属性

然而你得出了一个非常错误的结论,即这些类应该相互继承(即相互提供一些行为/属性)。相反,您应该做的是创建第三个类,这些类将从中继承(无论它们应该具有什么共同点)。

一种可能的基于接口的方法可以是例如:

class Displayable 
public:
    virtual void display();
;

class Book : public Displayable 
    ...
;

class MainScreen : public Displayable 
    ...
;

【讨论】:

以上是关于如何在从 A 继承 B 的同时从 B 继承 A 类? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何继承从一个基类继承的不同类的特定变量?

java子类从父类继承某个属性,怎么添加特定的注解不影响父类

在类 a 声明之前从类 a 继承类 b

接口可以继承多个接口总结

C++中什么是菱形继承,怎么解决?

面向对象2