免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3758 | 回复: 14
打印 上一主题 下一主题

[函数] 问一个类继承时关于虚函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-03 14:42 |只看该作者 |倒序浏览

  1. #include <iostream>;
  2. #include <string>;

  3. using namespace std;
  4. class B
  5. {
  6.         public:
  7.                 B():b_("Base Class")
  8.                 {
  9.                         init();
  10.                 }
  11.                 virtual void init()
  12.                 {
  13.                         cout<<"In class B's init!\n";
  14.                         cout<<b_<<endl;
  15.                 }
  16.         private:
  17.                 string b_;
  18. };

  19. class D : public B
  20. {
  21.         public:
  22.                 D():d_("Derive Class")
  23.                 {
  24.                 }
  25.                 void init()
  26.                 {
  27.                         cout<<"In class D's init!\n";
  28.                         cout<<d_<<endl;
  29.                 }
  30.         private:
  31.                 string d_;
  32. };

  33. main()
  34. {
  35.         B *b;
  36.         b=new D;
  37.         // Out is :
  38.         // In class B's init!
  39.         // Base Class
  40.         // Why not:
  41.         // In class D's init!
  42.         // Derive Class
  43.         return 0;
  44. }
复制代码


这是怎么回事,高人帮我解释解释,能不能还有其他方法实现?

论坛徽章:
0
2 [报告]
发表于 2003-03-03 15:29 |只看该作者

问一个类继承时关于虚函数的问题

是我没写清楚,还是我提的问题太简单?

怎么没人回答我。   

论坛徽章:
0
3 [报告]
发表于 2003-03-03 16:42 |只看该作者

问一个类继承时关于虚函数的问题

if you chang class D::init() ==>; virual void init() 就可以了。因为base class calling init() is B::init() .

论坛徽章:
0
4 [报告]
发表于 2003-03-03 17:00 |只看该作者

问一个类继承时关于虚函数的问题

[quote]原帖由 "zhuxa"]if you chang class D::init() ==>; virual void init() 就可以了。因为base class calling init() is B::init() .[/quote 发表:


D::init()不用声明virtual它就是virtual,因为基类中已经声明过了。你可以按照你的方法试一试,还是不对。

论坛徽章:
0
5 [报告]
发表于 2003-03-03 17:09 |只看该作者

问一个类继承时关于虚函数的问题

主要是在构造base类时,编译器所能见到的虚函数是base::init(),在构造base class 之后,接着构造derive class 时,编译器见到derive::init()时
如果init() 是虚函数,就把base::init() 替换成derive::init();

论坛徽章:
0
6 [报告]
发表于 2003-03-03 17:21 |只看该作者

问一个类继承时关于虚函数的问题

你的意思是改成这样,这个我上边写那个是一样的!

  1. #include <iostream>;
  2. #include <string>;

  3. using namespace std;
  4. class B
  5. {
  6.    public:
  7.       B():b_("Base Class")
  8.       {
  9.          init();
  10.       }
  11.       virtual void init()
  12.       {
  13.          cout<<"In class B's init!\n";
  14.          cout<<b_<<endl;
  15.       }
  16.    private:
  17.       string b_;
  18. };

  19. class D : public B
  20. {
  21.    public:
  22.       D():d_("Derive Class")
  23.       {
  24.       }
  25.       virtual void init()
  26.       {
  27.          cout<<"In class D's init!\n";
  28.          cout<<d_<<endl;
  29.       }
  30.    private:
  31.       string d_;
  32. };

  33. main()
  34. {
  35.    B *b;
  36.    b=new D;
  37.    // Out is :
  38.    // In class B's init!
  39.    // Base Class
  40.    // Why not:
  41.    // In class D's init!
  42.    // Derive Class
  43.    return 0;
  44. }
复制代码


这样子输出的依然是基类的init,我想要得到派生类的init,大哥,你再仔细看看我的意思。

如果直接调用b->;init()当然是调用的派生类中的init()。

我问的是在基类的构造函数中调用init()为什么不被替换为d::init()。

论坛徽章:
0
7 [报告]
发表于 2003-03-03 19:44 |只看该作者

问一个类继承时关于虚函数的问题

这个问题很简单啊,
根本没有涉及到虚函数的问题。

在new D;的时候,先调用父类B的构造函数,那么就打出了
In class B's init!
   Base Class
然后在回到D的构造函数,
在D的构造函数里面没有执行代码,
所以就只打出了上面的两行代码


----------------------------
革命尚未成功,同志还需要努力!

论坛徽章:
0
8 [报告]
发表于 2003-03-03 20:10 |只看该作者

问一个类继承时关于虚函数的问题

我现在就是想在B类构造时能够调用D的init(),由于init()是虚函数,是动态绑定,故我想在B *ptr=new D时能够动态绑顶init(),如果在构造时不能实现,我只好在B *ptr=new D后,再调用ptr->;init()来调用D::init()了。

但是我不明白为什么在B的构造时不能够动态绑定。   

论坛徽章:
0
9 [报告]
发表于 2003-03-03 20:19 |只看该作者

问一个类继承时关于虚函数的问题

当new D的时候,首先要调用父类的构造函数,但这个时候类D的对象并不存在,从编译器的角度看是不可能知道到底是什么样的子类构造引起的父类对象构造,但却必须调用一个实际存在的函数,而它能确定的只有B::init()。如果B::init()是个纯虚函数的话,应该会报错。虚函数在实现的时候可能会象函数指针一样指向某个地方,但这种指向也是需要初始化的,你想让父类的init()指向子类的init(),但因为子类对象还不存在,所以是不可能的。一般而言,不要在构造函数里调用虚函数。

论坛徽章:
0
10 [报告]
发表于 2003-03-03 20:34 |只看该作者

问一个类继承时关于虚函数的问题

[quote]原帖由 "雷斯林"]当new D的时候,首先要调用父类的构造函数,但这个时候类D的对象并不存在,从编译器的角度看是不可能知道到底是什么样的子类构造引起的父类对象构造,但却必须调用一个实际存在的函数,而它能确定的只有B::init()。?.........[/quote 发表:


噢,明白了,只有一个实例真正构造完成时,才可以用它的虚函数,在构造期间时还没有形成。

谢谢了。   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP