Chinaunix

标题: 问一个类继承时关于虚函数的问题 [打印本页]

作者: biansj    时间: 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. }
复制代码


这是怎么回事,高人帮我解释解释,能不能还有其他方法实现?
作者: biansj    时间: 2003-03-03 15:29
标题: 问一个类继承时关于虚函数的问题
是我没写清楚,还是我提的问题太简单?

怎么没人回答我。   
作者: zhuxa    时间: 2003-03-03 16:42
标题: 问一个类继承时关于虚函数的问题
if you chang class D::init() ==>; virual void init() 就可以了。因为base class calling init() is B::init() .
作者: biansj    时间: 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,因为基类中已经声明过了。你可以按照你的方法试一试,还是不对。
作者: zhuxa    时间: 2003-03-03 17:09
标题: 问一个类继承时关于虚函数的问题
主要是在构造base类时,编译器所能见到的虚函数是base::init(),在构造base class 之后,接着构造derive class 时,编译器见到derive::init()时
如果init() 是虚函数,就把base::init() 替换成derive::init();
作者: biansj    时间: 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()。
作者: pcerma    时间: 2003-03-03 19:44
标题: 问一个类继承时关于虚函数的问题
这个问题很简单啊,
根本没有涉及到虚函数的问题。

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


----------------------------
革命尚未成功,同志还需要努力!
作者: biansj    时间: 2003-03-03 20:10
标题: 问一个类继承时关于虚函数的问题
我现在就是想在B类构造时能够调用D的init(),由于init()是虚函数,是动态绑定,故我想在B *ptr=new D时能够动态绑顶init(),如果在构造时不能实现,我只好在B *ptr=new D后,再调用ptr->;init()来调用D::init()了。

但是我不明白为什么在B的构造时不能够动态绑定。   
作者: 雷斯林    时间: 2003-03-03 20:19
标题: 问一个类继承时关于虚函数的问题
当new D的时候,首先要调用父类的构造函数,但这个时候类D的对象并不存在,从编译器的角度看是不可能知道到底是什么样的子类构造引起的父类对象构造,但却必须调用一个实际存在的函数,而它能确定的只有B::init()。如果B::init()是个纯虚函数的话,应该会报错。虚函数在实现的时候可能会象函数指针一样指向某个地方,但这种指向也是需要初始化的,你想让父类的init()指向子类的init(),但因为子类对象还不存在,所以是不可能的。一般而言,不要在构造函数里调用虚函数。
作者: biansj    时间: 2003-03-03 20:34
标题: 问一个类继承时关于虚函数的问题
[quote]原帖由 "雷斯林"]当new D的时候,首先要调用父类的构造函数,但这个时候类D的对象并不存在,从编译器的角度看是不可能知道到底是什么样的子类构造引起的父类对象构造,但却必须调用一个实际存在的函数,而它能确定的只有B::init()。?.........[/quote 发表:


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

谢谢了。   
作者: huicer    时间: 2003-03-04 10:18
标题: 问一个类继承时关于虚函数的问题
它在第一句话
  1.   B*b;
复制代码

会不会已调用默认构造函数,
难道只有用
  1. B  b;
复制代码
时才会吗?
作者: 雷斯林    时间: 2003-03-04 11:31
标题: 问一个类继承时关于虚函数的问题
指向对象的指针和对象本身不是一回事,B *b只是声明一个基类对象的指针,表示它可以指向一个B或B的子类的对象,但并不确定指向什么地方,如果把指针本身看作是一个对象的话,则调用的是对指针的构造函数,而非指针指向的对象的构造函数。而B b则声明了一个变量,这个的确是要去调用B的构造函数,因为这个语句执行后,名字为b的这个对象事实在在地存在了。
作者: pcerma    时间: 2003-03-04 22:44
标题: 问一个类继承时关于虚函数的问题
to:huicer

                B*b;
是不会调用构造函数的,只是生成一个指针而已
作者: pcerma    时间: 2003-03-04 22:57
标题: 问一个类继承时关于虚函数的问题
对C++理解深刻的人都知道,虚函数的设置是为了实现多太性,
多太的实现的需要3个条件:
1)需要用到的函数申明为virtual;
2)类作为参数使用,且是类的指针或引用的形式;
3)需要使用”父类“作为参数使用;

因此,我始终认为,搂主这段代码始终没有没有设计到什么虚函数,
更确切的说是多太的问题,只不过是普通函数的调用问题而已。
呵呵!

----------------------
革命尚未成功,同志还需努力!
作者: biansj    时间: 2003-03-04 23:36
标题: 问一个类继承时关于虚函数的问题
原帖由 "pcerma" 发表:
对C++理解深刻的人都知道,虚函数的设置是为了实现多太性,
多太的实现的需要3个条件:
1)需要用到的函数申明为virtual;
2)类作为参数使用,且是类的指针或引用的形式;
3)需要使用”父类“作为参数使用;
..........


非常感谢,我理解又深刻了一些,不讨论,有时候还真不能把问题搞清楚!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2