游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2052|回复: 8

该怎样继承啊??

[复制链接]

26

主题

324

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
QQ
发表于 2004-9-12 11:36:00 | 显示全部楼层 |阅读模式
在用到类的继承时遇到一些疑问 [em5]
如下:
#include<iostream.h>
class B
{
public:
        B();
        ~B();

        void Fun();
        void Diao();
};

class A : virtual public B
{
public:
        A();
        ~A();
        void Diao();
};

void B::Fun()
{
        cout<<"先从这开始:"<<endl;
        Diao();
}

void B:iao()
{
        cout<<"这是B中的Diao()."<<endl;
}

void A::Diao()
{
        cout<<"这是A中的Diao()."<<endl;
}

void main()
{
        A *a;
        a = new A();
        a->Fun();
}

最后的显示结果是:先从这开始:
这是B中的Diao().

我想要的结果是用类B中的Fun()函数,可是其中的Diao()想用的是类A中的Diao(),而不是类B中的Diao()。
如果要在A类中也设一个Fun()函数,然后调用自己中的Diao()函数,那继承就没有意义了吧。每个函数都重载了,直接设为独立的类也行啊!
所以想请问前辈们用没有办法用B类的Fun函数,可是其中用A类中的Diao函数?? [em24] [em10]

26

主题

324

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
QQ
 楼主| 发表于 2004-9-12 11:37:00 | 显示全部楼层

Re: 该怎样继承啊??

对了!我不管是把B类设为虚基类还是直接继承都不行! [em10]

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2004-9-12 12:38:00 | 显示全部楼层

Re:该怎样继承啊??

调用以下函数
void B::Fun()
{
cout<<"先从这开始:"<<endl;
Diao();
}
a->Fun()
被解析成这样
B(A a)
{
cout<<"先从这开始:"<<endl;
a->Diao();
}
所以输出就是 “这是A中的Diao()”


如果想用B的Fun调用B的Diao:
将Diao申明为virtual Function,在B类中实现,A类中不实现就可以了,继承时由于只实现了B中的Diao,所以直接继承过来,输出就变成“ 这是B中的Diao()”,不过我觉得你的设计不自然,很别扭。

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2004-9-12 12:41:00 | 显示全部楼层

Re:该怎样继承啊??

更正:
”如果想用B的Fun调用B的Diao:” 这句写错了,应该为 “如果想用A的Fun调用B的Diao:”

26

主题

324

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
QQ
 楼主| 发表于 2004-9-12 20:09:00 | 显示全部楼层

Re: Re:该怎样继承啊??

不是啊!我想要的结果就是:“这是A中的Diao()”,也就是想要A中的Fun()调用自己的A类的Diao()函数啊!
可是它显示的结果是:"这是B中的Diao()."所以才奇怪啊! [em7]

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2004-9-13 12:05:00 | 显示全部楼层

Re:该怎样继承啊??

让我先想想

26

主题

324

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
QQ
 楼主| 发表于 2004-9-13 12:34:00 | 显示全部楼层

Re:该怎样继承啊??

我将基类B中的Diao()函数设为虚函数virtual Diao()就可以了。可是为什么呢? [em24]

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2004-9-13 18:19:00 | 显示全部楼层

Re:该怎样继承啊??

A->Fun();
是这样转化的:
B::Fun(B* const this )
a->Fun(a)
{
a->Diao();
}
虽然a申明为A类型的指针,但当它进行调用是转化为B类型的指针,而非静态成员函数的调用是静态绑定的,所以他调用的是B中的Diao,而不是A中的Diao。
将B中Diao申明为virtual后,就成了虚函数多态性了,虽然按照上面的还是B类型的指针,但是实体是A,只不过指针类型为B,A也实现了Diao,根据多态性原理,a->Diao()调用的是A中的Diao,注意此时的a是B类型的指针(经由A类型的指针转化过来的).

26

主题

324

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
QQ
 楼主| 发表于 2004-9-13 23:11:00 | 显示全部楼层

Re:该怎样继承啊??

终于懂了。谢谢啊!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-18 15:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表