【C++虚函数】C++虚函数和虚析构及标准C语言读取数值矩阵

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoxiao133/article/details/88723764

C++虚函数及其纯虚函数学习。
虚函数:子类可以实现具体函数,如果子类没有实现基类回自动补上。
纯虚函数:子类必须实现,不实现编译 不能通过。

虚析构:基类必须用虚析构函数这样子类析构(消失灭亡)时候才会释放基类申请的空间。

标准C语言读取数值矩阵:标准C语言从txt读取数值,分隔符是逗号和空格。
具体代码使用方式如下。

QtCreator下载链接:https://github.com/XiaoGongWei/StoreData/blob/master/VirtulaClassTest.zip

Qt设计界面读取txt,解析或者显示,代码下载链接:
https://github.com/XiaoGongWei/StoreData/blob/master/readFileDisplay.zip

People.h

#ifndef PEOPLE_H
#define PEOPLE_H
#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

class People
{
public:
    People();
    virtual ~People();
    virtual void speakName()
    {
        cout << "i am People." << endl;
    }

public:
    string m_name;
    double m_whight;
    bool m_sex;
    double *m_leg;
};

class david: public People
{
public:
    david();
    ~david();
    void speakName();
    void speakName(string spk_str);
    double *m_david_leg;
};

class mawj: public People
{
public:
    mawj()
    {
        cout << "mawj()" << endl;
    }
    ~mawj()
    {
        cout << "~mawj()" << endl;

    }
    void speakName()
    {
        cout << " i am mawj" << endl;
    }

};

#endif // PEOPLE_H

People.cpp

#include "People.h"

People::People()
{
    m_name = "admin";
    m_whight = 50;
    m_sex = 1;
    m_leg = new double(100);
}

People::~People()
{
    cout << "People::~People()  start" << endl;

    cout << "m_leg->" << 0 << "->" << m_leg[0] << endl;

    delete m_leg;

    cout << "People::~People()  11111111" << endl;
    cout << "m_leg->" << 0 << "->" << m_leg[0] << endl;

    cout << "People::~People()  end" << endl;
}

david::david()
{
    m_david_leg = new double(199);
    m_name = "david";
    m_leg[0] = 9999;
    m_sex = 1;

}

david::~david()
{
    cout << "david::~david()" << endl;
    cout << "david::~david() m_david_leg->" << m_david_leg << endl;
    delete m_david_leg;
    cout << "david::~david() m_david_leg->" << m_david_leg << endl;
}

void david::speakName()
{
    cout << "david::speakName() -> m_name:" << m_name << endl;
    cout << "david::speakName() -> m_leg:" << m_leg[0] << endl;
}


void david::speakName(string spk_str)
{
    char *p = "ABCD";
    int *in = new int(4);
    cout << sizeof(p) << p << endl;
    cout << sizeof(in) << *in << endl;
    cout << "david::speakName() -> m_name:" << spk_str << endl;
    delete in;
}

mian.cpp

#include <iostream>
#include <stdio.h>
#include "People.h"
using namespace std;

void speakName(People *ppa)
{
    ppa->speakName();
}

int str2num(char *str, double *num)
{
    int allnum = 0;

    while('\0' != *str && '\n' != *str)
    {
        char bufstr[100] = {0};
        int flag = 0;
        while((' ' == *str || ',' == *str))
            str++;
        while(!(' ' == *str || ',' == *str))
        {
            if('\n'==*str || '\0' == *str)
                break;

            bufstr[flag] = *str;
            flag++;
            str++;

        }
        *num = atof(bufstr);
        num++;
        allnum++;
    }
    return allnum;
}

void readMat(char *filename)
{
    FILE *pid = fopen(filename, "r");
    if(NULL == pid)
        return ;
    while(!feof(pid))
    {
        char bufstr[1024]={0}, *shutchar;
        double bufnum[1024] = {0.0};
        int i = 0, allnum = 0;
        fgets(bufstr, 1024, pid);
        bufstr[1000] = '\0';
        shutchar = &bufstr[0];

        allnum = str2num(shutchar, bufnum);

        for(i = 0; i < allnum;i++)
            printf("%lf, ", bufnum[i]);

        printf("\n");

    }
    fclose(pid);
}

int main(int argc, char *argv[])
{
    // read matrix from txt
    readMat("/home/danid/mat.txt");

    // test for virtual function
    People *ppeo = NULL;

    ppeo = new david();
    speakName(ppeo);
    ((david *)ppeo)->speakName("AAAAAAAAAAAA");
    delete ppeo;

    ppeo  = new mawj();
    speakName(ppeo);
    delete ppeo;
    return 0;
}




猜你喜欢

转载自blog.csdn.net/xiaoxiao133/article/details/88723764