读书人

困惑小弟我的有关问题(有关虚函数),烦

发布时间: 2012-02-08 19:52:21 作者: rapoo

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

读书人网 >C++

热点推荐