以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  C++中多态性的讨论  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=56175)


--  作者:xqxrr
--  发布时间:11/29/2007 9:17:00 AM

--  C++中多态性的讨论
输出下面程序结果。

#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;
};
};
class C:public B
{
public:
virtual void print(void)
{
  cout<<"C::print()"<<endl;
}
};
void print(A a)
{
   a.print();
}
void main(void)
{
   A a, *pa,*pb,*pc;
   B b;
   C c;
   
   pa=&a;
   pb=&b;
   pc=&c;
   
   a.print();
   b.print();
   c.print();
   
   pa->print();
   pb->print();
   pc->print();
   
   print(a);
   print(b);
   print(c);
}

结果如下:
A::print()
B::print()
C::print()
A::print()
B::print()
C::print()
A::print()
A::print()//为什么不是B::print()
A::print()//为什么不是C::print()

请大家谈谈自己的看法


--  作者:tianzhaoling
--  发布时间:3/6/2008 2:42:00 PM

--  
void print(A a)
问题就是上面这条语句
print(b); print(c);
上面两个调用会执行 A a = b,A a = c;的类型转换,照理说,这种写法应该会报错才对。。。
把void print(A a) 改为void print(A * a)  { a->print(); },调用时写为print(&b);就应该没问题了

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms