基层成员没有期望值

时间:2019-05-05 15:24:55

标签: c++ operators logical-operators

我正在学习C ++,并且是一个不错的初学者。我在理解为什么存在逻辑错误或运行时错误时遇到了一些麻烦。谁能解释我做错了什么?

我已经知道了一种解决方案,方法是删除类A和B中的函数,并在构造函数中简单地定义它,但是如果这是正确的方法,为什么我不能像我一样在其他函数中对其进行初始化呢?

#include <stdlib.h>
#include<iostream>
using namespace std;

class A
{
  protected:
  int x;
  public:

void Init()
{
  x = 10;
 }
   };

class B
{
protected:
    int x;
public:

     void Init()
    {
        x = 20;
    }
};

class C: public A, public B
{
public:
   void Test()
   {

      cout << "A's x is " << A::x;
      cout << "\nB's x is " << B::x;
   }
};

int main()
{
    C c;
    c.Test();
    return 0;
}

我期待一个正常的结果,我通常会通过“ this”函数进入java。

A's x is 10
B's x is 20

但是我得到的是

A's x is 8
B's x is 50

2 个答案:

答案 0 :(得分:0)

A::Init()B::Init()都没有被调用。 A::xB::xuninitialized

答案 1 :(得分:0)

在C ++中,您应该提供默认构造函数的类。 要存储在STL容器(例如std :: vector)中的类,还需要默认构造函数。

在Java中,编译器可能会代表您执行此操作,并且您的代码可以正常工作。

无论如何,在特定情况下,您应该初始化两个调用

的基类。
A::Init();
B::Init();

在调用派生c.Test()之前。

class C : public A, public B
{
   public:
   void Test()
    {
       A::Init();
       B::Init();
       cout << "A's x is " << A::x;
       cout << "\nB's x is " << B::x;
    }
};


   //output
   A's x is 10
   B's x is 20

致谢