没有调用适当的构造函数

Not calling the appropriate constructor

#include<iostream>
using namespace std;
class String
{
    protected:
        enum {SZ= 80};
        char str[SZ];
    public:
        String (){str[0]='[=10=]';}
        String(char s[])
        {
            strcpy(str,s);
        }
        void display() const
        {  
            cout<<str;
        }
        operator char*()
        {
            return str;
        }
};
class Pstring : public String
{
    public:
        Pstring(char s[])
        {
            if(strlen(s)>SZ-1)
            {
                for(int j=0;j<SZ-1;j++)
                {
                    str[j]=s[j];
                }
                str[SZ-1]='[=10=]';
            }
            else
            {String(s);}
        }
};
int main()
{
  Pstring s2 ="This is a strong string.";
  cout<<"\ns2="; s2.display();
return 0;
}

s2.display() returns 空白。调试发现Pstring中的String(s)调用了Stringclass中的无参构造函数。我将其理解为具有一个参数的构造函数,因此应该调用 String(char s[]) 。这是什么行为?

这段代码

        else
        {String(s);}

没有意义。

这一行

String(s);

String 类型的变量 s 的声明,其范围为 if 语句的 else 部分的复合运算符。

注意这个构造函数

Pstring(char s[])

在将控件传递给构造函数主体之前,隐式调用 class String 的默认构造函数。即只有在派生class的创建对象sub-objects全部被创建后,构造函数的主体才获得控制权。

您应该将对传递的字符串的检查放在 class String.

的构造函数中

例如在 class String 你可以用下面的方式定义带参数的构造函数

    String( const char s[] )
    {
        strncpy( str, s, SZ );
        str[SZ - 1] = '[=13=]';
    }

派生的 class 中的构造函数可以定义为

    Pstring( const char s[] ) : String( s )
    {
    }