关于对象

yuio123465 2009-10-21 09:43:15
#include<iostream.h>
class A
{
public:virtual void print(void)
{
cout<<"A::print()"<<endl;
};
};
class B:public A
{
public:virtual void print(void)
{
cout<<"B::print()"<<endl;
};
};
void print(A a)
{
a.print();
}
int main(void)
{
A a;
B b;
print(a);
print(b);
return 0;
}
这个为什么输出都是A::print()啊
...全文
143 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangbingzhe 2009-10-21
  • 打赏
  • 举报
回复
convert class B to class A !
TADICAN 2009-10-21
  • 打赏
  • 举报
回复
虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行晚绑定,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。

在void print(A a)
{
a.print();
}
里面执行的是静态绑定。

参考:http://hi.baidu.com/scfan/blog/item/0ebd40a772338d95d14358fd.html.
arong1234 2009-10-21
  • 打赏
  • 举报
回复
这和指针没什么特别得关系,引用一样可以实现多态。问题在于他得方法使得最后形参是传进去参数得一个拷贝,而这个拷贝只拷贝了A不过,实际上调用了A(const A&a)重新创建了一个A,和他传进去是什么没关系
[Quote=引用 2 楼 stardust20 的回复:]
用指针才能体现出多态性
C/C++ code#include<iostream>usingnamespace std;class A
{public:virtualvoid print(void)
{
cout<<"A::print()"<<endl;
};
};class B:public A
{public:virtualvoid print(void)
{
cout<<"B::print()"<<endl;
};
};void print(A* a)
{
a->print();
}int main(void)
{
A a;
B b;
print(&a);
print(&b);return0;
}
[/Quote]
borefo 2009-10-21
  • 打赏
  • 举报
回复
因为void print(A a) 的参数是A类型,当然调用A的方法啦
lz可以试试下面代码

void print(A *a)
{
a->print();
}
int main(void)
{
A a;
B b;
print(&a);
print(&b);

return 0;
}


如果参数是基类指针的话,就可以用到多态的特性
wanjingwei 2009-10-21
  • 打赏
  • 举报
回复
void print(A a)
{
a.print();
}
这是传值,最后构造的都是基类A的对象,调用A的print()
stardust20 2009-10-21
  • 打赏
  • 举报
回复
用指针才能体现出多态性
#include <iostream>
using namespace std;
class A
{
public:virtual void print(void)
{
cout <<"A::print()" <<endl;
};
};
class B:public A
{
public:virtual void print(void)
{
cout <<"B::print()" <<endl;
};
};
void print(A* a)
{
a->print();
}
int main(void)
{
A a;
B b;
print(&a);
print(&b);
return 0;
}
  • 打赏
  • 举报
回复
...这个问题太难,你得好好看看书...

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧