Зачем нам виртуальный в этой программе (Turbo C ++)? - PullRequest
0 голосов
/ 19 апреля 2020

Я кодировал в Turbo C ++ относительно множественного наследования , и цель кода - просто взять ввод и распечатать ввод на консоли. Первоначально я сделал следующий код,

// Program to demonstrate multiple inheritance

#include <conio.h>
#include <iomanip.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>>
#include <string.h>

class Company1
{
protected:
  int productID;
  char *productName;
  char *CompanyName;

public:
  void input_c1()
  {
    cout << "Provide Company 1 Details : " << endl;
    cout << setw(29) << setfill('-') << "" << endl;
    cout << "Enter the Product ID : ";
    cin >> productID;
    cout << "Enter the Product Name : ";
    gets(productName);
    cout << "Enter the Company Name : ";
    gets(CompanyName);
  }
};

class Company2
{
protected:
  int productID;
  char *productName;
  char *CompanyName;

public:
  void input_c2()
  {
    cout << endl << "Provide Company 2 Details : " << endl;
    cout << setw(29) << setfill('-') << "" << endl;
    cout << "Enter the Product ID : ";
    cin >> productID;
    cout << "Enter the Product Name : ";
    gets(productName);
    cout << "Enter the Company Name : ";
    gets(CompanyName);
  }
};

class SuperMarket : public Company2, public Company1
{
public:
  void Company_details()
  {
    cout << endl << "Company 1 details : " << endl;
    cout << setw(20) << setfill('-') << "" << endl;
    cout << "Product ID   : " << Company1::productID << endl;
    cout << "Product Name : ";
    print_string(Company1::productName);
    cout << endl;
    cout << "Company Name : ";
    print_string(Company1::CompanyName);
    cout << endl << endl;

    cout << "Company 2 details : " << endl;
    cout << setw(20) << setfill('-') << "" << endl;
    cout << "Product ID   : " << Company2::productID << endl;
    cout << "Product Name : ";
    print_string(Company2::productName);
    cout << endl;
    cout << "Company Name : ";
    print_string(Company2::CompanyName);
  }
  void print_string(char *ptr)
  {
    for (int i = 0; i != strlen(ptr); i++)
      cout << ptr[i];
  }
};

void main()
{
  char choice;
  clrscr();
  SuperMarket s;
  s.input_c1();
  s.input_c2();
  s.Company_details();
  cout << endl << "Do you want to exit ? (Y/N) : ";
  cin >> choice;
  if (choice == 'Y' || choice == 'y')
    exit(0);
  getch();
}

, и получил при выводе следующий вывод:

Click here to see the output

Но это был не вывод, который ожидается, потому что Название компании из Company1 равно dklm , вместо этого ожидалось, что оно будет def . Далее я попытался исправить его и сделал тип деривации Company1 как virtual publi c, и это привело к правильному выводу. Я слышал, что virtual используется в основном в случаях Diamond проблема . Несмотря на то, что проблема Diamond не , она привела к правильному выводу. Кто-нибудь может объяснить, почему я получил такой неправильный вывод в упомянутой программе и как виртуал заставил программу работать должным образом в этом случае?

1 Ответ

4 голосов
/ 19 апреля 2020

Указатели productName и CompanyName неинициализированы, поэтому вы не можете использовать их, как если бы они указывали на действительное хранилище для некоторых символов. Вы должны просто использовать std::string вместо char* указателей, чтобы уберечь себя от этого и многих других проблем.

Хотя в Turbo C ++ нет std::string, но, возможно, вы найдете хороший класс строки для него, если вы должны использовать этот компилятор. Я не могу больше помочь с этим, поскольку Turbo C ++ едва ли считается на этом этапе C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...