为什么我们在这个程序中需要虚拟(Turbo C++)?
Why we need virtual in this program (Turbo C++)?
我一直在使用 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();
}
执行后得到如下输出,
但这不是预期的输出,因为 Company1 的 Company Name 是 dklm 而应该是 def。我进一步尝试纠正它,并将 Company1 的派生类型设为 virtual public,这导致了正确的输出。我听说虚拟主要用于钻石问题的情况。尽管不是 钻石级问题,但它产生了正确的输出。任何人都可以解释为什么我在提到的程序中得到这种错误的输出以及在这种情况下虚拟如何使程序正常运行?
指针 productName
和 CompanyName
未初始化,因此您不能像它们指向某些字符的有效存储一样使用它们。你应该只使用 std::string
而不是 char*
指针,以避免这个问题和许多其他问题。
虽然 Turbo C++ 没有 std::string
,但如果您必须使用那个编译器,也许您可以为它找到一个好的字符串 class。我真的帮不上什么忙,因为 Turbo C++ 在这一点上什至算不上 C++。
我一直在使用 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();
}
执行后得到如下输出,
但这不是预期的输出,因为 Company1 的 Company Name 是 dklm 而应该是 def。我进一步尝试纠正它,并将 Company1 的派生类型设为 virtual public,这导致了正确的输出。我听说虚拟主要用于钻石问题的情况。尽管不是 钻石级问题,但它产生了正确的输出。任何人都可以解释为什么我在提到的程序中得到这种错误的输出以及在这种情况下虚拟如何使程序正常运行?
指针 productName
和 CompanyName
未初始化,因此您不能像它们指向某些字符的有效存储一样使用它们。你应该只使用 std::string
而不是 char*
指针,以避免这个问题和许多其他问题。
虽然 Turbo C++ 没有 std::string
,但如果您必须使用那个编译器,也许您可以为它找到一个好的字符串 class。我真的帮不上什么忙,因为 Turbo C++ 在这一点上什至算不上 C++。