• 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(){};
  • 相关阅读:
    Java学习笔记——动态代理
    Java学习随笔——RMI
    数据结构与算法——排序算法
    设计模式——装饰者模式
    Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法
    vs中debug的一个小技巧 -- debug时忽略某段代码
    SilverlightMVVM模式中的数据校验
    技能图谱
    MQ队列管理器损坏的处理方法
    informix数据库锁表处理方法
  • 原文地址:https://www.cnblogs.com/jevan/p/3030855.html
Copyright © 2020-2023  润新知