孙鑫的《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?! 或者是对继承这个词的理解有分歧,我认为子类里有,就算是被继承了,难道不是么?有精确的“继承”的定义么?
#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?! 或者是对继承这个词的理解有分歧,我认为子类里有,就算是被继承了,难道不是么?有精确的“继承”的定义么?
#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;
}
“使用公有派生,基类的公在成员将成为派生类的公有成员;基类的么有部分也将成为泒生类的一部分,但只能通过基类的公有和保护方法访问。”这样的描述比较严谨,国内书常有似是而非的句子。继承有很多的细节需要注意,用几句话就能定义出来的例子可能不太好找。
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;
}