NDK-CPP语言-继承

46 篇文章 1 订阅
42 篇文章 0 订阅

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.tz.ndk.cpp.MainActivity"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="1.重载运算符: 重载'[]'"
        android:onClick="clickCppOperatorBrackets"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="2.C++中继承: 语法"
        android:onClick="clickCppExtendsGrammar"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="3.C++中继承:构造函数和初始化父类属性"
        android:onClick="clickCppExtendsConstruct"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="4.C++中继承:成员函数重写"
        android:onClick="clickCppExtendsFuncOverride"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="5.C++中继承:多继承"
        android:onClick="clickCppExtendsMore"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="6.C++中继承:虚函数"
        android:onClick="clickCppExtendsVirtualFunc"/>


</LinearLayout>
java类:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("native-lib");
    }

    private NDKCpp ndkCpp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ndkCpp = new NDKCpp();

    }

    public void clickCppOperatorBrackets(View v){
        ndkCpp.callCppOperatorBrackets();
    }

    public void clickCppExtendsGrammar(View v){
        ndkCpp.callCppExtendsGrammar();
    }

    public void clickCppExtendsConstruct(View v){
        ndkCpp.callCppExtendsConstruct();
    }

    public void clickCppExtendsFuncOverride(View v){
        ndkCpp.callCppExtendsFuncOverride();
    }

    public void clickCppExtendsMore(View v){
        ndkCpp.callCppExtendsMore();
    }

    public void clickCppExtendsVirtualFunc(View v){
        ndkCpp.callCppExtendsVirtualFunc();
    }

}

public class NDKCpp extends Object{

    //1.重载运算符: 重载'[]'
    public native void callCppOperatorBrackets();

    //2.C++中继承: 语法
    public native void callCppExtendsGrammar();

    //3.C++中继承:构造函数和初始化父类属性
    public native void callCppExtendsConstruct();

    //4.C++中继承:成员函数重写
    public native void callCppExtendsFuncOverride();

    //5.C++中继承:多继承
    public native void callCppExtendsMore();

    //6.C++中继承:虚函数
    public native void callCppExtendsVirtualFunc();

}

c代码:

com_tz_ndk_cpp_NDKCpp.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_tz_ndk_cpp_NDKCpp */

#ifndef _Included_com_tz_ndk_cpp_NDKCpp
#define _Included_com_tz_ndk_cpp_NDKCpp
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_tz_ndk_cpp_NDKCpp
 * Method:    callCppOperatorBrackets
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppOperatorBrackets
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsGrammar
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsConstruct
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsFuncOverride
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsMore
        (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsVirtualFunc
        (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
com_tz_ndk_cpp_NDKCpp.cpp

#include <iostream>
#include <android/log.h>
#include "com_tz_ndk_cpp_NDKCpp.h"


//1.重载运算符: 重载'[]'
#include "bean/CharArray.h"
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppOperatorBrackets
        (JNIEnv *, jobject){

    CharArray charArray = CharArray(5);
    //char类型的本质就是int类型
    //我们给这个char数组保存A以后的字母
    int value = 65;
    for (int i = 0; i < charArray.size(); ++i) {
        charArray.set(i,value);
        value++;
    }

    //输出
    for (int i = 0; i < charArray.size(); ++i) {
        __android_log_print(ANDROID_LOG_INFO,"main","第%d值:%c",i,charArray.get(i));
    }
}


//2.C++中继承: 语法
#include "bean/Company.h"
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsGrammar
        (JNIEnv *, jobject){
//    TzCompany company;
//    company.name = "潭州教育";

    //在Java中:父类的引用可以指向子类的实例
    //C++中是可以的
    TzCompany tzCompany("潭州教育");
    Company company = tzCompany;
}

//3.C++中继承:构造函数和初始化父类属性
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsConstruct
        (JNIEnv *, jobject){
    //初始化父类的属性?
    //总结:构造方法调用的顺序,先调用父类构造,在调用子类构造,先析构子类,再析构父类
    //其实和Java一样
    MiddleStudent middleStudent("Dream","男","不早恋");
    middleStudent.toString();
}


//4.C++中继承:成员函数重写
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsFuncOverride
        (JNIEnv *, jobject){
//    MiddleOneStudent oneStudent;
//    oneStudent.puppylove();
//
//    //怎么调用父类的呢?
//    oneStudent.MiddleStudent::puppylove();


}


//5.C++中继承:多继承
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsMore
        (JNIEnv *, jobject){
    //正常调用:出错
//    UniversityTeacher universityTeacher;
//    //一下代码存在歧义
//    universityTeacher.name = "Dream";

    //解决方案:虚继承
    UniversityTeacher universityTeacher;
    universityTeacher.name = "Draem";
    //访问父类
    __android_log_print(ANDROID_LOG_INFO,"main","姓名: %s",universityTeacher.name);
    __android_log_print(ANDROID_LOG_INFO,"main","MiddleTeacher父类: %s",universityTeacher.MiddleTeacher::name);
    __android_log_print(ANDROID_LOG_INFO,"main","HighTeacher父类: %s",universityTeacher.HighTeacher::name);

    //打印地址
    __android_log_print(ANDROID_LOG_INFO,"main","姓名地址: %p",&(universityTeacher.name));
    __android_log_print(ANDROID_LOG_INFO,"main","MiddleTeacher父类地址: %p",&(universityTeacher.MiddleTeacher::name));
    __android_log_print(ANDROID_LOG_INFO,"main","HighTeacher父类地址: %p",&(universityTeacher.HighTeacher::name));

}


//6.C++中继承:虚函数
//在Java中抽象类(继承),方法重载(当前类中),方法覆盖(基于继承)
//需求:
//什么是多态?
//分析什么是多态?

//案例:电脑的开机和关机?
#include "simple/ComputerManager.h"
#include "simple/MacComputer.h"
#include "simple/SurfaceBookComputer.h"
JNIEXPORT void JNICALL Java_com_tz_ndk_cpp_NDKCpp_callCppExtendsVirtualFunc
        (JNIEnv *, jobject){
    ComputerManager computerManager;
    MacComputer macComputer;
    computerManager.startup(macComputer);
    computerManager.shutdown(macComputer);

    SurfaceBookComputer surfaceBookComputer;
    computerManager.startup(surfaceBookComputer);
    computerManager.shutdown(surfaceBookComputer);

    //多态:增强系统可扩展性
    //什么是动态多态:
    //答:程序在编译阶段并不知道执行目标函数,而是等到运行的时候才指定目标函数,这就是动态多态
    //别人问到了什么是多态?
    //回答技巧:
    //先把java回答,列举一个案例,写出来
    //接下来在分析一下C++中的多态(virtual)
    //ndk开发

    //面试的技巧

    //静态多态:当前类中(方法重载)
    //动态多态:方法重写(基于继承)

    //动态多态:在C++中称之为动态联编

    //抽象
}

CharArray.h

#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_CHARARRAY_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_CHARARRAY_H

#include <iostream>

1.重载运算符: 重载'[]'
class CharArray {

private:
    char* array;
    int length;

public:
    CharArray(int length);
    ~CharArray();

    char get(int index);

    void set(int index,char value);

    int size();

public:
    //重载'[]'运算符
    char operator[](int index);

};


#endif
CharArray.cpp

#include "CharArray.h"


CharArray::CharArray(int length) {
    if(length < 0){
        length = 0;
    }
    //创建数组(开辟内存空间)
    //在C语言中 malloc开辟内存空间创建数组
    //在C++中new关键字开辟一块内存空间
    this->array = new char[length];
    this->length = length;
}

CharArray::~CharArray() {
    if(this->array != NULL){
        delete[] this->array;
        this->array = NULL;
    }
}

char CharArray::get(int index) {
    return this->array[index];
}

void CharArray::set(int index, char value) {
    this->array[index] = value;
}

int CharArray::size() {
    return this->length;
}

char CharArray::operator[](int index) {
    return this->array[index];
}
Company.h

#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_COMPANY_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_COMPANY_H

#include <android/log.h>

//2.C++中继承: 语法
//第一个内容:语法
//在Java中是:extends
//在C++中是:':'
//在C++中可以多继承
//普及一下:在OC和Swift语言中,继承的关键字也是':'
//语言通性(OOP思想)
//java面向对象编程思想
//class Company {
//
//};
//
//class TzCompany : public Company{
//
//};
//
//class TzSoftCompany : Company,TzCompany{
//
//};

//第二个内容:继承修饰符
//继续.....
//在C++中继承体系修饰符
//修饰符访问权限(属性身上)
//private:只允许在当前类中访问
//protected:允许在当前类中访问+子类中允许访问
//public:任何地方都允许访问
//属性修饰符(控制父类属性的访问)

//继承修饰符:修饰父类中的属性的访问权限(指的范围:子类和外部类)
//
//class Company {
//private:
//    char* name;
//};
//
//class TzCompany : public Company{
//    void toString(){
//
//    }
//};

//第三个内容:父类和子类兼容
class Company {
private:
    char* name;
public:
    Company(){

    }
    //线上授课
    void onlineTeaching(){

    }
};

class TzCompany : public Company{

private:
    //上课方式
    char* type;

public:

    TzCompany(char* type){
        this->type = type;
    }

    void toString(){
        __android_log_print(ANDROID_LOG_INFO,"main","线上授课");
    }
};




//3.C++中继承:构造函数和初始化父类属性
//学生类
class Student{
private:
    char* name;
    char* sex;
public:
    Student(){

    }
    Student(char* name,char* sex){
        this->name = name;
        this->sex = sex;
        __android_log_print(ANDROID_LOG_INFO,"main","Student构造函数");
    }
    Student(char* name){
        this->name = name;
        __android_log_print(ANDROID_LOG_INFO,"main","Student构造函数");
    }
    ~Student(){
        __android_log_print(ANDROID_LOG_INFO,"main","Student析构函数");
    }
};

//初中生
class MiddleStudent : public Student{
private:
    //描述
    char* desc;
    Student womanStudent;

public:
    MiddleStudent(){

    }
    MiddleStudent(char* name,char* sex,char* desc) : Student(name) ,womanStudent(name){
        this->desc = desc;
        __android_log_print(ANDROID_LOG_INFO,"main","MiddleStudent构造函数");
    }
    ~MiddleStudent(){
        __android_log_print(ANDROID_LOG_INFO,"main","MiddleStudent析构函数");
    }
    void toString(){
        __android_log_print(ANDROID_LOG_INFO,"main","%s",this->desc);
    }

    void puppylove(){
        __android_log_print(ANDROID_LOG_INFO,"main","初中生早恋了");
    }

};




//4.C++中继承:成员函数重写
//注意:调用父类的函数或者属性,必须继承修饰符为public,默认是private
class MiddleOneStudent : public MiddleStudent{

public:
    void puppylove(){
        __android_log_print(ANDROID_LOG_INFO,"main","辣妈早,初一的也居然早恋了!");
    }
};



//5.C++中继承:多继承
场景分析
//class Teacher{
//
//};
初中老师
//class MiddleTeacher : Teacher{
//
//};
高中老师
//class HighTeacher : Teacher{
//
//};
大学老师
//class UniversityTeacher : public MiddleTeacher,public HighTeacher{
//
//};

//场景分析
class Teacher{
public:
    char* name;
};
//初中老师
class MiddleTeacher : virtual public Teacher{

};
//高中老师
class HighTeacher : virtual public Teacher{

};
//大学老师
class UniversityTeacher : virtual public MiddleTeacher,virtual public HighTeacher{

};

//解决方案:虚继承(关键字:virtual)
//虚继承:不同路径继承来的同名的成员属性只有一份拷贝,解决了不明确问题


#endif 

Computer.h

#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_COMPUTER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_COMPUTER_H

#include <android/log.h>

class Computer {
public:
    //电脑开机
    virtual void startup(){
        __android_log_print(ANDROID_LOG_INFO,"main","电脑开机");
    }

    //关机
    virtual void shutdown(){
        __android_log_print(ANDROID_LOG_INFO,"main","电脑关机");
    }
};


#endif 

ComputerManager.h

#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_COMPUTERMANAGER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_COMPUTERMANAGER_H

#include "Computer.h"

//OO设计(Java、C++、OC、Swift、C#、PHP思想是相通的)
//需求:希望管理器能够支持现有的电脑,同时还能够支持未来的电脑?
//可以支持,但是你会发现耦合
//一下方式称之为静态多态(很多垃圾代码)
//特别是做android端?
//继承(动态多态)
class ComputerManager {
public:

    //电脑开机
    void startup(Computer &computer){
        computer.startup();
    }

    //关机
    void shutdown(Computer &computer){
        computer.shutdown();
    }

};


#endif

LenvoComputer.h

#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_LENVOCOMPUTER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_LENVOCOMPUTER_H

#include <android/log.h>
#include "Computer.h"

class LenvoComputer {


};


#endif 

MacComputer.h

#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_MACCOMPUTER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_MACCOMPUTER_H

#include <android/log.h>
#include "Computer.h"

class MacComputer : public Computer{
public:
    //电脑开机
    virtual void startup(){
        __android_log_print(ANDROID_LOG_INFO,"main","Mac电脑开机");
    }

    //关机
    virtual void shutdown(){
        __android_log_print(ANDROID_LOG_INFO,"main","Mac电脑关机");
    }
};


#endif

SurfaceBookComputer.h

#ifndef DREAM_NDK_CPP_11_9_18_SIMPLE_SURFACEBOOKCOMPUTER_H
#define DREAM_NDK_CPP_11_9_18_SIMPLE_SURFACEBOOKCOMPUTER_H

#include <android/log.h>
#include "Computer.h"

//微软的surfacebook电脑
class SurfaceBookComputer : public Computer{
public:
    //电脑开机
    void startup(){
        __android_log_print(ANDROID_LOG_INFO,"main","SurfaceBook电脑开机");
    }

    //关机
    void shutdown(){
        __android_log_print(ANDROID_LOG_INFO,"main","SurfaceBook电脑关机");
    }

};


#endif




整理自示例代码





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值