Фон:
У меня есть базовый класс, 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;
}