c ++:类继承层次结构中指针数据成员的行为

时间:2011-06-17 06:25:09

标签: c++ inheritance pointers

class Base {

    protected:
            string m_strName;
            char* pchChar;
    public:
            Base()
            {
                    m_strName = "Base";
                    pchChar   = NULL;
            };

           void display()
            {
                    printf(" display name : %s %c\n",m_strName.c_str(),pchChar);
             };
  };

 class Derived : protected Base {
       public:
               Derived()
               {
                       init();
               };

            void init()
            {
                    m_strName = "Derived";
                    pchChar = (char*)malloc(sizeof(char));
                    strcpy(pchChar,"A");
                    printf(" char %c\n",*pchChar);
                    display();
            };
};

int main()
{
        Derived* pDerived = new Derived();
        return 0;
}

观察到的输出是

    char A
    display name : Derived P

虽然我预计pchChar在两种情况下都应该具有值“A”。 我错过了任何一条信息吗? 请建议。

2 个答案:

答案 0 :(得分:2)

您忘记了*

printf(" display name : %s %c\n",m_strName.c_str(), *pchChar);

应该是*pchChar,而不是pchChar。因为您将其打印为%c

或者您可以使用%s作为格式字符串,如果c-string是以空字符结尾的字符串,则printf将起作用。目前它不是以空值终止的。你应该这样做:

pchChar = (char*)malloc( 2 * sizeof(char)); //2 chars, one for `\0`
strcpy(pchChar,"A");

甚至更好地使用newstd::cout

另外,一旦完成内存,请不要忘记用free调用malloc来取消分配内存。如果您使用new,请使用delete

答案 1 :(得分:2)

printf(" display name : %s %c\n",m_strName.c_str(),pchChar);

应该是:

printf(" display name : %s %c\n",m_strName.c_str(),*pchChar);

第一个将指针强制转换为一个字符,因此完全取决于该字符位于地址空间中的 where

第二个将正确地取消引用指向获取角色的指针,就像你在派生类的init代码中所做的一样。

这个小片段:

pchChar = (char*)malloc(sizeof(char));

"A"字符串分配足够的空间,您需要两个字符:

pchChar = (char*)malloc(2); // sizeof(char) is ALWAYS 1 !!!

或者更好的是,根本不要使用malloc。尽管C ++为C兼容性提供了这些功能,但您最好使用newdelete