首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

困惑小弟我的有关问题(有关虚函数),烦请大家指教

2012-02-08 
困惑我的问题(有关虚函数),烦请大家指教大家先帮我看下下面两段代码:/*------Test in C++-------*/#includ

困惑我的问题(有关虚函数),烦请大家指教
大家先帮我看下下面两段代码:
/*------Test in C++-------*/
#include <iostream>
using namespace std;

class A{
public:
  virtual void func1(){
  cout<<"当前是A类的func1()被调用"<<endl;
  }

  void func2(){
  cout<<"当前是A类的func2()被调用"<<endl;
  }

  ~A(){
  cout<<"此时A类的对象被删除"<<endl;
  }
};

class B:public A{
public:
  virtual void func1(){
  cout<<"当前是B类的func1()被调用"<<endl;
  }

  void func_t(){
  cout<<"当前是B类的func_t()被调用"<<endl;
  }

  ~B(){
  cout<<"此时B类的对象被删除"<<endl;
  }
};

int main(){
  A a;
  B b;

  a.func1();
  a.func2();

  b.func1();
  b.func2();
  b.func_t(); //main()函数里的以上代码输出结果在我的预料之中

  a = b; //问题就出在这里,把对象b赋给a后,a.func1()调用的仍然是A类的func1()函数
  a.func1();
  a.func2();

  system("pause");
}


//据说java里所有的非静态方法都是虚函数,我又在java下做了一个实验
/*----Test in Java-----*/

public class MyJava_1 {
   
  public static void main(String[] args) {
   
  // TODO, add your application code
  A a = new A();
  a.func();
   
  B b = new B();
  b.func();
   
  a = b;
  a.func(); //在这里的结果是a 调用了B类的方法,而在C++中这个例子却是a 调用了A类的方法,为什么?
  b.func_t();

  }
}

class A{
  public void func(){
  System.out.println("This is class A.");
  }
}

class B extends A{
  public void func(){
  System.out.println("This is class B.");
  }

public void func_t(){
  System.out.println("This is class B's second func.");
  }
}

上面就是我想问的关于C++和java的虚函数的事情,C++的测试里我把func1()声明成了虚函数,在java的测试里由于所有的非静态方法都是virtual的,所以不用另外声明,但是C++里的结果和JAVA里的结果却大不一样,我不明白,恳请大家帮我解惑,谢谢

另外,在C++那个例子里,main()函数终止前会先调用一次B类的析构,再调用两次A类的析构,我就不明白了.


[解决办法]
a = b; //问题就出在这里,把对象b赋给a后,a.func1()调用的仍然是A类的func1()函数 
a.func1();
````````````````````````````````````
a = b;这只是对像赋值``

 对像和对像之间是不互想干涉的
[解决办法]
A a; //一次A类的析构
B b; //一次A类的析构,A是B的子对象

[解决办法]
在C++里面,A a;的意思是定义A类型的对象a,
a=b;的时候将会类型转换的

而java里面 A a;的意思是定义类型A的引用a;并没有建立对象,相当于c++里的A &a=..;
如果你想上面的两个结果一致的话,可以把c++里
A a;改成A & a=b;

热点排行