关于多态的问题
请看如下代码
__abstract __gc class a
{
public:
void method()
{
Console::WriteLine(S"基类方法");
}
};
__abstract __gc class b: public a
{
public:
virtual void method()=0;
};
__gc class c: public b
{
public:
void method()
{
Console::WriteLine(S"派生类方法");
}
};
[目标]:
a为基类,b类继承自a,并将method声明为纯虚函数;c类继承自b,实现method
[测试代码]:
a * mya=new c();
c->method();
[测试结果]:(期待输出:派生类方法)
输出为:基类方法
[结论]:失败
解决方法????应该怎样实现?
多谢!!!
[注]环境为.net2003托管c++
问题点数:20、回复次数:8Top
1 楼wanderfox()回复于 2006-07-03 13:55:03 得分 5
a * mya=new c();
c->method();
应该是mya->method吧?
还有,如果a类的方法method声明为virtual,就会出现你要的结果了Top
2 楼changyanxiao(踏雪无情)回复于 2006-07-03 15:36:19 得分 0
要想实现多态,必须从基类a开始就声明为虚类Top
3 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-03 16:28:38 得分 5
有点混乱 ...
纯虚函数作为一个接口函数,
应当在最底层被声明,在派生中被实现 ....
楼主的这种做法....
有点不太好吧 ....Top
4 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-03 16:30:47 得分 0
呵呵,
楼主可以把 class a 的 method 声明为 virtual 的 ...Top
5 楼hqycxy(仇笑雨)回复于 2006-07-03 16:58:08 得分 0
楼主的做法 像出考试题。。。Top
6 楼sunf71()回复于 2006-07-03 18:15:21 得分 0
不好意思写错了,多谢wanderfox朋友!
这个问题是在看《head first design patterns》时出现的,在书中decorator模式这一章中,例子程序中就是这样做的,但是书中用的语言是java。Top
7 楼lan_yanjing(露寒)回复于 2006-07-08 10:00:06 得分 5
楼主的做法 像出考试题。。。
同意
按楼主的写法
a * mya=new c();
c->method();
相当于执行a::method,是一个普通的成员函数,没有virtual字是不会去寻找c类的method方法的
楼主可以试试这样写
b * myb = new c () ;
b->a::method() ;
b->method () ;
结果是 :
基类方法 派生类方法Top
8 楼lan_yanjing(露寒)回复于 2006-07-08 10:00:54 得分 5
不好意思,我也写错了,是
myb->a::method();
myb->method();Top




