请问创建动态对象,重载new时为什么要做类型转换

请问创建动态对象,重载new时为什么要做类型转换(见下列代码注释)

 #include <iostream>
#include <cstring>
using namespace std;
class String
{
    int length;
    char *Strp;
public:
    void * operator new(size_t size);
    void * operator new(size_t size, char *str);
    void * operator new(size_t size, String &s);
    void print()
    {
        cout << "string = " << Strp << endl;
        cout << "length = " << length << endl;
    }
    void operator delete(void *p)
    {
        if(p)
        {
            String *t = (String *) p;
            if(t -> Strp)
                delete [](t->Strp);
            delete [](char *) p;
        }
        cout << "Delete" << endl;
    }
};
void * String::operator new(size_t size)
{
    String *p = (String *)new char[size];      //为什么要先new一个字符数组然后再做类型转换?
    p -> length = 0;
    p -> Strp = new char[p -> length + 1];
    *(p -> Strp) = '\0';
    cout << "New 1\n";
    return (void *)p;
}

void * String::operator new(size_t size, char *str)
{
    String *p = (String *)new char[size];
    p -> length = strlen(str);
    p -> Strp = new char[p -> length + 1];
    strcpy(p -> Strp, str);
    cout << "New 2\n";
    return (void *)p;
}

void * String::operator new(size_t size, String &s)
{
    String *p = (String *)new char[size];
    p -> length = s.length;
    p -> Strp = new char[(p -> length) + 1];
    strcpy(p -> Strp, s.Strp);
    cout << "New 3\n";
    return (void *)p;
}

int main()
{
    String *ptr1, *ptr2, *ptr3;
    ptr1 = new String;
    ptr2 = new ("student")String;
    ptr3 = new (*ptr2)String;
    ptr1 -> print();
    ptr2 -> print();
    ptr3 -> print();
    delete ptr1;
    delete ptr2;
    delete ptr3;
    return 0;
}
String *p = (String *)new char[size]; 
new char[size]; 的类型是 char *
char *的变量用String *接收,它们不兼容就需要转换。

什么情况下不需要转换:
左边的类型和右边的类型相同
左边的类型是右边类型的基类
实现了隐式类型转换运算符
C++的内置类型,并且满足一定的关系,比如float->double,short->int