Какой объект производного класса называется не виртуальной функцией в базовом классе - PullRequest
0 голосов
/ 18 декабря 2018

Фон:

У меня есть базовый класс, Base , который имеет в основном"чистых" виртуальных функций и некоторые не виртуальныефункции (плюс пара виртуальных функций).

По сути, в базовом классе присутствует общая функциональность во всех производных классах Производные , Производные2 и т. д.как не виртуальные функции.

Вопрос: Если один из объектов из какого-либо из производных классов вызывает любую из не виртуальных функций из базового класса, то как (если вообще) можно было бы узнать, какой объект производного класса вызвал эту не виртуальную функцию базового класса.

На самом деле я хотел отладить один вызов и наткнулся на тот факт, что ни с отладчиком, ни сс помощью каких-либо tracelines, я могу выяснить, из какого производного объекта класса я наткнулся на эту не виртуальную функцию base-class.

Если подумать, я писал об этом один из способов,Я могу думать, я мог бы иметь статусc переменную-член в каждом производном классе и передачу ее в качестве аргумента функциям не виртуального базового класса.Но это единственный способ?

Минимальный рабочий пример: Вот минимальный рабочий пример.Я разобрал его как можно дальше.

#include <iostream>


#include <pthread.h>
#include <string>
#include <errno.h>
#include <cstring>

class Base {
public:
    Base() {}
    virtual ~Base() {}
    int waitForThreadToExit() {
        int error = pthread_join(m_Thread, NULL);
        if (0 != error) {
            std::cerr << "Error from pthread_join(). errorCode:" << strerror(errno) << std::endl;
        }
        return error;
    }

    int start() {
        if ((startThread()) != 0) {
             std::cerr << "error returned from the start() function." << std::endl;
         }
    }

protected:
    virtual int runThread(void) {
      std::cout << "Reimplement" << std::endl;;
      return -1;
    }
    int startThread() {
        int error = pthread_create(&m_Thread, NULL, internalThreadEntryFunc, this);
        return error;
    }

private:
    static void* internalThreadEntryFunc(void* This) {
        ((Base *) This)->runThread();
        return NULL;
    }
    pthread_t m_Thread;
};


class Derived: public Base {
public:
    Derived() {}
    virtual ~Derived() {}

private:
    virtual int runThread(void) {
        while(1) {
             std::cout << "Sehr gut!" << std::endl;;
             return 0;
        }
    }

};

class Derived2: public Base {
public:
    Derived2() {}
    virtual ~Derived2() {}

private:
    virtual int runThread(void) {
        while (1)
        {
            std::cout << "Sehr sehr gut!" << std::endl;;
            return 0;
        }
    }

};


int main()
{
    std::cout << "Hello World!" << std::endl;
    Derived d;
    Derived2 d2;
    d.start();
    d2.start();
    d.waitForThreadToExit();
    d2.waitForThreadToExit();
    return 0;
}

1 Ответ

0 голосов
/ 08 августа 2019

Итак, чтобы быть полным, на тот случай, если кто-то другой (вполне возможно, я сам через несколько месяцев) снова наткнется на этот вопрос, вот общая идея, которую я реализовал для этой проблемы.

#include <iostream>
#include <typeinfo>

class base {
public:
    virtual const char* name() {
        return typeid(*this).name();
    }
    virtual ~base(){}
};

class derived : public base {};
class otherDerived : public base {};

int main () {
    base b;
    derived d;
    otherDerived d2;

    std::cout << "base says:" << b.name() << std::endl;
    std::cout << "derived says:" << d.name() << std::endl;
    std::cout << "other derived says:" << d2.name() << std::endl;
}

который выдает результат при запуске в моем QtCreator:

база говорит: 4base
производная говорит: 7dervied
другая производная говорит: 12otherDerived

Примечание: Лучше всего создать виртуальную функцию name() или className() и вызывать эту функцию повсюду, а не разбрасывать typeid(*this).name() повсюду в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...