zoukankan      html  css  js  c++  java
  • 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(){};
  • 相关阅读:
    win8系统服务管理添加mysql的方法
    一步一步学SpringDataJpa——JpaRepository查询功能
    mysql本地实时同步和异地同步
    利用xml导出word文件---换行
    关于jdbc,mysql与postgres区别
    mysql通过bin-log恢复数据库
    jQuery之Deferred对象详解
    【转】$.ajax()引发的对Deferred的总结
    Tomcat 中响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding 之种种
    xml解析
  • 原文地址:https://www.cnblogs.com/jevan/p/3030855.html
Copyright © 2011-2022 走看看