读书人

这两种输出结果是如何来的

发布时间: 2013-10-18 20:53:13 作者: rapoo

这两种输出结果是怎么来的?
两个代码类似的抽象类,两种不同的输出结果。搞不清是怎么来的:

#include <iostream.h>
class A{
public:
virtual void printMe(){cout<< "This is class A printing. "<<endl;};
} ;
class B:public A{
public:
void printMe() {cout << "This is class B printing. "<<endl;}
} ;
class C:public B{
public:
void printMe() {cout <<"This is class C printing. "<<endl;}
} ;
void print(A a)
{
a.printMe();
}
void main()
{
B b;
C c;
print(b);
print(c);
}

输出结果为:
This is class A printing.
This is class A printing.
#include <iostream.h>
class A{
public:
virtual void printMe()=0;
} ;
class B:public A{
public:
void printMe() {cout << "This is class B printing. "<<endl;}
} ;
class C:public B{
public:
void printMe() {cout <<"This is class C printing. "<<endl;}
} ;
void print(A&a)
{
a.printMe();
}
void main()
{
B b;
C c;
print(b);
print(c);
}

输出结果为:
This is class B printing.
This is class C printing.

请问程序是怎么执行的?而且也搞不清楚对象void print(A a)和引用void print(A&a)是如何调用print(b);print(c);的。
初学者,请高手指点!
[解决办法]
c++的多态需要引用或指针类型实现,如果是一个对象的实体,就没有什么多态可言了
[解决办法]
第一个程序传值的方式:
print(b);是怎样调用print(A a)的?

1.创建一个新实例
A a;
2.通过强制类型转换赋值
a = (A)b;
3.调用函数
print(a);
你都没有定义void print(B b)这个函数,怎么可能期望有这个函数被执行


[解决办法]
引用:
Quote: 引用:

第一个程序传值的方式:
print(b);是怎样调用print(A a)的?

1.创建一个新实例
A a;
2.通过强制类型转换赋值
a = (A)b;
3.调用函数
print(a);
你都没有定义void print(B b)这个函数,怎么可能期望有这个函数被执行

还是有些迷糊。
是不是说无论怎么调用,都是类A的a.printMe();起作用?不会强制转换为类B的b.printMe();?


你传指针或者传引用就是调用b.printMe(), 传值会自动创建新的实例,而新实例在函数参数中定义是A类型的,所以调用a.printMe()
[解决办法]
建议楼主先理解一下虚汗数继承和虚函数表的相关知识。
然后再看引用void print(A&a)就比较容易理解。
而print(A a)就是个局部变量,所以print(b);
print(c)实际没传进参数。
[解决办法]
一个是值传递,一个是引用传递。一个传递参数的赋值,一个传递参数的地址

读书人网 >C++

热点推荐