下列程序的运行结果为:#include<iostream> #include<string> using namespace std ; class A_class { char name[20] ; public : void put_name( char * s ) { strcpy( name, s ) ; } void show() { cout << name << "\n" ; } }; class B_class : public A_class { char phone_num[ 20 ] ; public : void put_phone( char * num ) { strcpy ( phone_num , num ) ; } void show() { cout << phone_num << "\n" ; } }; int main() { B_class B_obj ; B_class * B_p ; A_class A_obj; //B_p=&A_obj; //出错,不用用派生类指针指向派生类对象 B_p = & B_obj ; B_p-> put_phone ( "5555_12345678" ); B_p -> show() ; B_p -> put_name( "Chen ming" ) ; B_p-> A_class::show(); ((A_class*)B_p )-> show() ; }
时间: 2024-03-26 12:36:36 浏览: 79
程序会出现编译错误,因为在B_class中,put_phone和show函数是新增加的函数,而put_name和show函数是从A_class中继承过来的。所以在使用B_class指针指向A_class对象时,无法调用B_class中新增加的函数。正确的做法是将B_p指针指向B_obj对象,然后通过B_p指针调用B_class中新增加的函数和继承自A_class的函数。最后,通过将B_p强制转换为A_class类型的指针,可以调用A_class中的函数。
相关问题
下列代码的运行结果为:#include<iostream> #include<string> using namespace std ; class A_class { string name[20] ; public : void put_name( string * s ) { strcpy( name, s ) ; } void show_name() { cout << name << "\n" ; } }; class B_class : public A_class { char phone_num[ 20 ] ; public : void put_phone( char * num ) { strcpy ( phone_num , num ); } void show_phone() { cout << phone_num << "\n"; } }; int main() { A_class * A_p ; A_class A_obj ; B_class B_obj ; A_p = & A_obj ; A_p -> put_name( "Wang xiao hua" ) ; A_p -> show_name() ; A_p = & B_obj ; A_p -> put_name( "Chen ming" ) ; A_p -> show_name() ; B_obj. put_phone ( "5555_12345678" ); ( ( B_class * ) A_p ) -> show_phone() ; }
该代码会出现编译错误。因为在类A_class中的name成员变量是一个字符串数组,而在成员函数put_name中使用了strcpy函数将一个字符串指针直接赋给了name数组,这是错误的。应该使用strcpy的安全版本strcpy_s,并指定要复制的字符串的长度。因此,需要将代码中的put_name函数修改为以下形式:
```
void put_name(string* s)
{
strcpy_s(name, sizeof(name), s->c_str());
}
```
另外,由于在类A_class中的name成员变量是一个字符串数组,因此在show_name函数中应该使用cout输出name数组的内容,而不是直接输出name指针。因此,需要将代码中的show_name函数修改为以下形式:
```
void show_name()
{
cout << name << "\n";
}
```
修改后的代码如下,运行结果会输出"Wang xiao hua"、"Chen ming"和"5555_12345678":
```
#include<iostream>
#include<string>
using namespace std;
class A_class
{
string name[20];
public:
void put_name(string* s)
{
strcpy_s(name, sizeof(name), s->c_str());
}
void show_name()
{
cout << name << "\n";
}
};
class B_class : public A_class
{
char phone_num[20];
public:
void put_phone(char* num)
{
strcpy(phone_num, num);
}
void show_phone()
{
cout << phone_num << "\n";
}
};
int main()
{
A_class* A_p;
A_class A_obj;
B_class B_obj;
A_p = &A_obj;
A_p->put_name(new string("Wang xiao hua"));
A_p->show_name();
A_p = &B_obj;
A_p->put_name(new string("Chen ming"));
A_p->show_name();
B_obj.put_phone("5555_12345678");
((B_class*)A_p)->show_phone();
}
```
#include<iostream> #include<string> using namespace std; namespace student2 { class Student { public: Student(int n,string nam,char s,float sco) { num=n; name=nam; sex=s; score=sco; } void show_data(); private: int num; string name; char sex; float score; }; void Student::show_data() { cout<<"num:"<<num<<" name:"<<name<<" sex:"<<sex<<" score:"<<score<<endl; } }
这是一个C++程序,包含了头文件iostream和string,并定义了一个命名空间student2和一个类Student。该类包含了一个构造函数和一个成员函数show_data,构造函数用于初始化类的数据成员,show_data函数用于输出数据成员的值。
该类的数据成员包括num、name、sex和score,分别表示学号、姓名、性别和成绩。show_data函数用于输出这些数据成员的值。
该程序中使用了命名空间student2,可以避免命名冲突。如果在程序中使用了多个类或函数,并且它们的名称相同,可以使用命名空间来区分它们。
阅读全文