孙鑫的《VC++深入详解》第46页那段被着色的话这么说“私有成员不能被继承”,这个说法难道不是错误的?!
#include <iostream>
using namespace std;
class Base
{
 int x;
public:
 void p(){cout << x << endl;}
 Base(){x = 6;}
};
class Derived:public Base
{
};
int main()
{
 Derived dobj;
 dobj.p();
 return 0;
}
 不能继承,怎么会运行显示个6?!  或者是对继承这个词的理解有分歧,我认为子类里有,就算是被继承了,难道不是么?有精确的“继承”的定义么?

解决方案 »

  1.   


    #include <iostream> 
    using namespace std; 
    class Base 

    int x; 
    public: 
    void p(){cout << x << endl;} 
    Base(){x = 6;} 
    }; 
    class Derived:public Base 

    void test(){cout<<x<<endl;} //错误,不能访问基类的私有成员
    }; 
    int main() 

    Derived dobj; 
    dobj.p(); //基类公有方法,可以使用
    return 0; 

      

  2.   

    《C++ Primer Plus》中文5版  P430
    “使用公有派生,基类的公在成员将成为派生类的公有成员;基类的么有部分也将成为泒生类的一部分,但只能通过基类的公有和保护方法访问。”这样的描述比较严谨,国内书常有似是而非的句子。继承有很多的细节需要注意,用几句话就能定义出来的例子可能不太好找。
      

  3.   

    私有成员当然不能不继承!不然怎么叫私有!
    public方式继承后,私有成员不能被子类使用,但可以被继承下来的父类方法使用
    看下面的代码:
    #include <iostream>
    #include <string>
    using namespace std;class CB
    {
    public:
           void display(){cout<<"display from "<<mystring<<endl;}       //调用自己的私有变量,合法 
           CB(string str):mystring(str){}                               //构造函数 
    private:
            string mystring;                                            //这是父类的私有成员变量 
    };
    class CD:public CB
    {
    public:
           CD(string str):CB(str){}                                    //子类构造函数 
           //Ddisplay(){cout<<<"Ddispaly from "<<mystring;}            这一行不能通过编译,子类妄图调用父类的私有成员变量           
          };
          
    int main (int argc, char *argv[])
    {
        CB B("B");
        CD D("D");
        B.display();                                                    //调用父类的公有函数,合法 
        D.display();                                                    //子类调用从父类继承而来的公有函数,公有函数再调用父类的私有成员变量,也合法 
        cin.get();
        return 0;
    }
      

  4.   

    孙鑫的书不是针对标准C++的,建议lz在学习MFC之前一定要学习标准C++,最好的教材一定是C++ primer了,最好在学习MFC之前或之后把Effective C++认认真真研习一遍
      

  5.   

    嗯, C++ primer 无限好啊。