Доступ к полям базового класса?
Зачем полям в базовом классе быть private? Сделайте их protected и пользуейтесь в наследниках. А ещё лучше, сделайте в базовом классе конструктор с параметрами.
Вирутальных конструкторов в C++ нет, но есть один паттерн, поищите какой.class Foo
{
public:
    Foo(int a1, int a2)
        : m_a1(a1)
        , m_a2(a2)
    {}

protected: // Если необходим доступ в потомках, в остальных случаях private
    int m_a1;
    int m_a2;
};

class Bar : public Foo
{
public:
    Bar(int a1, int a2)
        : Foo(a1, a2)
    {}
};
PS
Пользуйтесь #pragma once, деструктор в базовом классе должен быть виртуальным (не всегда... но пока просто делайте всегда), не смешивайте стили, не пишите имена транслитом.
В приведенном коде, то что вы делаете в конструкторе наследника Str_Indef(const char *st) - выстрел себе в ногу. Когда Вы сделаете члены с модификатором доступа protected - то автоматом получите утечку памяти. Почему? Потому что вызываете конструктор предка Stroka(st), который уже выделяет память для p_char. Далее снова идет выделение памяти, но уже в наследнике, а то что было выделено предком - затеряется. Про то, что код дублируется и делаете 2 раза одно и то же я вообще молчу.
Дальше. В данном случае Вам вообще не нужен прямой доступ к приватным членам. Все уже делает предок.
Оператор копирования должен возвращать ссылку:Stroka& operator=(const Stroka &st)
В наследнике - так же необходимо определить оператор копирования и конструктор копирования и не забыть в них вызвать оператор копирования и конструктор копирования предка.
Это беглым взглядом...