繁体   English   中英

为什么我们在这个程序中需要虚拟(Turbo C++)?

[英]Why we need virtual in this program (Turbo C++)?

我一直在 Turbo C++ 关于多个 inheritance进行编码,代码的目的是只获取输入并在控制台上打印输入。 我最初完成了以下代码,

// 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();
}

并在执行时得到如下 output,

点击这里查看输出

但这不是预期的 output ,因为Company1公司名称dklm而不是预期的def 我进一步尝试纠正它并将Company1的派生类型设为虚拟公共,这导致正确的output。 我听说虚拟主要用于钻石问题的情况。 尽管不是钻石问题,但它导致了正确的 output。 谁能解释一下为什么我在提到的程序中得到了这种错误的 output 以及在这种情况下虚拟机是如何使程序正常工作的?

指针productNameCompanyName未初始化,因此您不能像它们指向某些字符的有效存储一样使用它们。 您应该只使用std::string而不是char*指针,以避免这个问题和许多其他问题。

虽然 Turbo C++ 没有std::string ,但如果你必须使用该编译器,也许你可以找到一个好的字符串 class 。 我对此无能为力,因为此时 Turbo C++ 甚至算不上 C++。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM