C++中的虚函数!
1 /* 2 * test.cpp 3 * 4 * Created on: 2013-4-19 5 * Author: Administrator 6 */ 7 #include <utils/RefBase.h> 8 #include <stdio.h> 9 namespace android { 10 11 class A: public RefBase { 12 13 }; 14 15 class B { 16 public: 17 virtual void p() { 18 printf("!!!!!!!!!!!A\n"); 19 } 20 }; 21 22 class C: public B { 23 public : 24 25 void p() 26 { 27 printf("!!!!!!!!!!!B\n"); 28 } 29 }; 30 extern "C" int main(int argc,char **argv) { 31 A* pA = new A; 32 { 33 sp<A> spA(pA); 34 wp<A> wpA(pA); 35 } 36 37 C c; 38 c.p(); 39 } 40 41 }
正常编译,运行结果:
1 root@android:/ # t 2 !!!!!!!!!!!B
第二种情况:
如果C中不实现p函数,及:
1 /* 2 * test.cpp 3 * 4 * Created on: 2013-4-19 5 * Author: Administrator 6 */ 7 #include <utils/RefBase.h> 8 #include <stdio.h> 9 namespace android { 10 11 class A: public RefBase { 12 13 }; 14 15 class B { 16 public: 17 virtual void p() { 18 printf("!!!!!!!!!!!A\n"); 19 } 20 }; 21 22 class C: public B { 23 public : 24 25 }; 26 extern "C" int main(int argc,char **argv) { 27 A* pA = new A; 28 { 29 sp<A> spA(pA); 30 wp<A> wpA(pA); 31 } 32 33 C c; 34 c.p(); 35 } 36 37 }
正常编译,正常运行。结果是:
1 root@android:/ # t 2 !!!!!!!!!!!A
第三种情况:
如果B中不实现p函数。编译报错:
1 #include <utils/RefBase.h> 2 #include <stdio.h> 3 namespace android { 4 5 class A: public RefBase { 6 7 }; 8 9 class B { 10 public: 11 virtual void p(); 12 }; 13 14 class C: public B { 15 public : 16 17 }; 18 extern "C" int main(int argc,char **argv) { 19 A* pA = new A; 20 { 21 sp<A> spA(pA); 22 wp<A> wpA(pA); 23 } 24 25 C c; 26 c.p(); 27 } 28 } 29 //报错: 30 **** Build of configuration Default for project T **** 31 32 E:\android\adt-bundle-windows-x86-20130219\android-ndk-r8e\ndk-build.cmd all 33 "Compile++ thumb : t <= test.cpp 34 Executable : t 35 E:/android/adt-bundle-windows-x86-20130219/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/http://www.cnblogs.com/http://www.cnblogs.com/arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi/objs/t/test.o: in function main:jni/test.cpp:32: error: undefined reference to 'android::B::p()' 36 E:/android/adt-bundle-windows-x86-20130219/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/http://www.cnblogs.com/http://www.cnblogs.com/arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi/objs/t/test.o: in function vtable for android::C:test.cpp(.data.rel.ro._ZTVN7android1CE+0x8): error: undefined reference to 'android::B::p()' 37 collect2: ld returned 1 exit status 38 make: *** [obj/local/armeabi/t] Error 1 39 40 **** Build Finished ****
第四种情况:
如果B中函数p为这样:
1 #include <utils/RefBase.h> 2 #include <stdio.h> 3 namespace android { 4 5 class A: public RefBase { 6 7 }; 8 9 class B { 10 public: 11 virtual void p() = 0; 12 }; 13 14 class C: public B { 15 public : 16 17 }; 18 extern "C" int main(int argc,char **argv) { 19 A* pA = new A; 20 { 21 sp<A> spA(pA); 22 wp<A> wpA(pA); 23 } 24 25 C c; 26 c.p(); 27 } 28 } 29 //报错信息: 30 **** Build of configuration Default for project T **** 31 32 E:\android\adt-bundle-windows-x86-20130219\android-ndk-r8e\ndk-build.cmd all 33 "Compile++ thumb : t <= test.cpp 34 jni/test.cpp: In function 'int android::main(int, char**)': 35 jni/test.cpp:31:4: error: cannot declare variable 'c' to be of abstract type 'android::C' 36 jni/test.cpp:20:7: note: because the following virtual functions are pure within 'android::C': 37 jni/test.cpp:17:15: note: virtual void android::B::p() 38 make: *** [obj/local/armeabi/objs/t/test.o] Error 1 39 40 **** Build Finished ****
说明:c++中的虚函数还是比较宽松的。只是没有想到C++中的基类虚函数居然可以自带实现。
解决 has virtual method 'p' but non-virtual destructor警告。
1 //给class B增加虚的析构函数,因为继承是从基类开始析构的。 2 //如果不添加会出现警告:Class '[C@3c9c92' has virtual method 'p' but non-virtual destructor 3 virtual ~B(){};