困惑我的问题(有关虚函数),烦请大家指教
大家先帮我看下下面两段代码:
/*------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;