【问题标题】:Why doesn't data member inherit in a diamond problem c++为什么数据成员不继承钻石问题c ++
【发布时间】:2021-04-04 11:14:48
【问题描述】:

所以,我正在学习继承,去年的问题集中有一个问题。这只是为了创建一个菱形问题并将数据成员marks从基类继承到final class。所以,我为void setmarks() 创建了一个抽象基类,并在所有继承的类中覆盖它。为了解决歧义,我在继承声明中添加了virtual

这是我的代码:

#include <iostream>

using namespace std;

class Evalution

{

    public:
    float marks;

    virtual void setmarks()=0;
    
    void displaymarks() {}

};


class Theoretical :virtual protected Evalution
{
    public:
    float internal1, internal2;
    int assignments;
    
    void setmarks()
    {
        cout << "enter the marks in internal1, internal2, assignments" << endl;
        cin >> internal1 >> internal2 >> assignments;
    }
};


class Practical :virtual protected Evalution
{
    public:
    float lab, viva;
    
    void setmarks()
    {
        cout << "enter the marks in lab and viva" << endl;
        cin >> lab >> viva;
    }
};


class Final : public Theoretical, public Practical
{
    public:
     marks = internal1 + internal2 + assignments + lab + viva;
    
    void setmarks() {}
     void displaymarks()
    {
        cout << "the final marks is " << marks << endl;
    }
};

int main()
{
    Final f;
    f.Theoretical::setmarks();
    f.Practical::setmarks();
    f.displaymarks();
}

在在线gcc compiler 上运行程序时,出现错误‘marks’ does not name a type。什么地方出了错?即使:

class Evalution
{
    public:
     //float marks;
     virtual void setmarks()=0;
     void displaymarks() {}
};

还有:

class Final : public Theoretical, public Practical
{
    public:
    float marks = internal1 + internal2 + assignments + lab + viva;
    
    void setmarks() {}
     void displaymarks()
    {
        cout << "the final marks is " << marks << endl;
    }
};

程序仍然给我一个垃圾值。请帮忙。

【问题讨论】:

  • 您似乎希望编译器猜测您的意图并让float marks = internal1 + internal2 + assignments + lab + viva; 仅在输入后执行?
  • 即使是常规继承,您似乎也有问题...
  • 这与继承无关。一个班级也会有同样的问题。

标签: c++ inheritance compiler-errors multiple-inheritance diamond-problem


【解决方案1】:

此时,编译器需要一个成员声明

class Final : public Theoretical, public Practical {
public:
    marks = internal1 + internal2 + assignments + lab + viva;

因此它寻找一个类型。但是marks不是类型,而是基类中的成员变量。这就是编译器抱怨的原因

'marks' 没有命名类型


当你改变它时

float marks = ...;

编译器看到预期的成员声明。

但这一次成员 marks 是在对象构造时初始化的,而不是在其他成员被分配适当的值之后。


有关详细信息,请参阅 Class declarationNon-static data members,或者可能是 The Definitive C++ Book Guide and List 的其中一本书

【讨论】:

    【解决方案2】:

    在计算最终分数之前,您需要先通过setmarks()基类方法设置变量internal1internal2等,然后通过计算总和来设置最终分数。

    #include <iostream>
    
    using namespace std;
    
    class Evalution
    
    {
    
        public:
        float marks;
    
        virtual void setmarks()=0;
        
        void displaymarks() {}
    
    };
    
    
    class Theoretical :virtual protected Evalution
    {
        public:
        float internal1, internal2;
        int assignments;
        
        void setmarks()
        {
            cout << "enter the marks in internal1, internal2, assignments" << endl;
            cin >> internal1 >> internal2 >> assignments;
            //internal1 = 10;
            //internal2 = 20;
            //assignments = 30;
        }
    };
    
    
    class Practical :virtual protected Evalution
    {
        public:
        float lab, viva;
        
        void setmarks()
        {
            cout << "enter the marks in lab and viva" << endl;
            cin >> lab >> viva;
            //lab = 234;
            //viva = 45;
        }
    };
    
    
    class Final : public Theoretical, public Practical
    {
        public:
        
        void setmarks() {
            this->Theoretical::setmarks();
            this->Practical::setmarks();
            marks = internal1 + internal2 + assignments + lab + viva;
        }
         void displaymarks()
        {
            cout << "the final marks is " << marks << endl;
        }
    };
    
    int main()
    {
        Final f;
        f.setmarks();
        f.displaymarks();
    }
    

    【讨论】:

    • 为什么 OP 应该“尝试这种方式”?你有什么改变?你为什么要做出这些改变? OP显示的代码有什么问题?请刷新how to write good answers
    • 非常感谢您。但是,我仍然是一个初学者,this-&gt; 对此有何帮助?我还是一头雾水。
    猜你喜欢
    • 2019-10-09
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2017-12-09
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多