Члены базового класса не имеют ожидаемых значений - PullRequest
1 голос
/ 05 мая 2019

Я изучаю 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;
}

Я ожидал Нормальный результат, который я обычно получал бы в Java с помощью функции "this".

т.е.

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

Но я получаю

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

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

В 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

С уважением

0 голосов
/ 05 мая 2019

Ни A::Init(), ни B::Init() не вызывается. A::x и B::x являются неинициализированными .

...