Q:

Авто приведение базового класса к классу потомка

Есть 1 базовый класс и 2 класса наследника. 
#include <iostream>
#include <vector>
#include <cstdio>
#include <typeinfo>
#include <map>
using namespace std;
class NotBase1;
class NotBase2;
class Base;

class Base{    
public:

    int a=0;
    template<typename T>
    T* get_type();

};

class NotBase1:public Base{
    public:
    NotBase1* get_type(){
        return this;
    }

    int z =90;

};

class NotBase2:public Base{
public :

    NotBase2* get_type(){
        return this;
    }
    int p = 100;

};

int main() {
    std::vector<Base*> stru;
    NotBase1* b1 = new NotBase1;
    NotBase2* b2 = new NotBase2;
stru.push_back(b1);
stru.push_back(b2);

stru[0]->get_type<NotBase1>()->z;

    return 0;
}

Каким образом и можно ли, при обращении к элементу вектора, работать с его элементами как с дочерними объектами класса? Не используя шаблоны и не указывая явно какого типа объект как тут stru[0]->get_type()->z;

A:

Нельзя делать то что Вы хотите, что должно произойти в Вашем примере, если в stru[0] будет находится не NotBase1, а NotBase2 ?
Вот примерная попытка адаптировать Вашу задачу:
#include <iostream>
#include <vector>

class Base
{
public:
    int a = 0;

    virtual int getValue() const = 0;
};

class NotBase1 : public Base
{
    public:

    int getValue() const override
    {
        return z;
    }

    int z = 90;

};

class NotBase2 : public Base
{
public:
    int getValue() const override
    {
        return p;
    }

    int p = 100;
};

int main(int argc, char *argv[])
{
    std::vector<Base*> stru;
    stru.push_back(new NotBase1);
    stru.push_back(new NotBase2);

    for(Base *item : stru)
    {
        std::cout << item->getValue() << std::endl;
    }

    return 0;
}

Вывод:
90
100

Для того чтоб все-таки достучатся к переменных наследуемых типов, то можно воспользоваться dynamic_cast. Но это пример плохого кода.
int main(int argc, char *argv[])
{
    std::vector<Base*> stru;
    stru.push_back(new NotBase1);
    stru.push_back(new NotBase2);

    for(Base *item : stru)
    {
        NotBase1 *derived1 = dynamic_cast<NotBase1*>(item);
        if(derived1)
        {
            std::cout << derived1->z << std::endl;
        }

        NotBase2 *derived2 = dynamic_cast<NotBase2*>(item);
        if(derived2)
        {
            std::cout << derived2->p << std::endl;
        }
    }

    return 0;
}

