#include <iostream>
#include <string.h> // strlen, strcpy
Here we have the Base class with a non-default ctor, a getter for name and its destructor.
class Base {
  char *name_;
public:
  Base(const char* str)
    : name_{new char[strlen(str)]}
  {
    strcpy(name_,str);
  }
  char * name() const
  {
    return name_;
  }
  virtual ~Base()
  {
    delete [] name_;
  }
};
Derived class inherits from Base publicly and has its own non-default ctor.
class Derived : public Base {
public:
  Derived(const char* str)
    : Base(str){}
};
My question is how do I make the last line of code in main to work?
int main()
{
  char d1name[] {"d1"};
  Derived d1(d1name);
  std::cout << d1.name() << std::endl;
  d1.name[0] = 'D';
}
 
    