#include <iostream>

using namespace std;

struct FS {
	int first;
	int second;
};
    
class FuncModule {
protected:
	virtual FS** getFunc() = 0;
};

class FuncRealized : public FuncModule{

public:
	FS InnerClassFS; //Объявлена структура типа FS

	FS** getFunc(){ //функция/метод должна вернуть указатель на указатель на структуру типа ФС
		cout << "getFunc WORKS!" << endl;

		InnerClassFS.first = 11;
		InnerClassFS.second = 20;

		FS *pTestFS;    // Указатель на структуру типа FS
		static FS **ppTestFS;  // Указатель на указатель на структуру типа FS
		pTestFS = &InnerClassFS; //присваиваем адрес структуры описанной в классе
		ppTestFS = &pTestFS;  //присваеваем адрес адреса структуры опис. в классе
		// Проверка значений указателей
		cout << pTestFS << " Указатель на структуру " << endl;
		cout << ppTestFS << " Указатель на указатель на структуру " << endl;
			cout << "getFunc END Work!" << endl;
		return ppTestFS;
	};
};

int main(){

	FS **pointFStruct; // Объявили указатель на указатель на структуру типа FS
	FS *pFSStruct;

	FuncRealized FRealObject; // Объявили объект

	pointFStruct = FRealObject.getFunc();  // Сработала функция/метод
	
	pFSStruct = (*(pointFStruct)); // хорошо, давайте запомним этот указатель
	
	cout << pointFStruct << " _ _ _ " << pFSStruct << " _ _ _ " <<*(pointFStruct) << endl; // Выведем Указатель на указатель и Указатель
	cout << pointFStruct << " _ _ _ " << pFSStruct << " _ _ _ " << *(pointFStruct) << endl; // Выведем Указатель на указатель и Указатель
	cout << pointFStruct << " _ _ _ " << pFSStruct << " _ _ _ " << *(pointFStruct) << endl; // Выведем Указатель на указатель и Указатель
	cout << pointFStruct << " _ _ _ " << *(pointFStruct) << endl; // Выведем Указатель на указатель и Указатель
	cout << pointFStruct << " _ _ _ " << *(pointFStruct) << endl; // Выведем Указатель на указатель и Указатель

	cout << (*(pointFStruct)) << endl;
	cout << &(FRealObject.InnerClassFS.first) << endl;
	cout << FRealObject.InnerClassFS.first << endl;

	return 0;
}