分类: C/C++
2011-06-15 10:32:31
值得提出的是:在C++primer中存在这样一句话 :“派生类只能通过派生类对象访问其基类的protected成员,派生类对基类类型对象的protected成员没有访问权限。”(详见 C++primer 第四版特别版475页 )这句话是错的,派生类对象无法访问基类的protected成员,
派生类对基类的protected成员可以访问,派生类无法通过其基类类型对象来调用基类的protected成员。
一句话:继承的时候,无论用什么方式(public.protected.private),子类随时都可以访问父类的非private变量或函数。
我想总结出三点:大家记住有帮助:
1 对象只可以访问最终的(继承标号作用后)public成员。 例如public经过public继承 那么它可以是类的对象可访问,当然也可类访问。
2 类的private成员在子类中不可访问,实际上他根本就没有被继承。
3 类的protected成员只可以被类或子类访问,不可以被对象访问。
protected专门就是为继承(子类)设计的,用public继承 那么基类所有的访问标识在子类不变 。
下面是验证我说的那个断定“派生类对象无法访问基类的protected成员,派生类对基类的protected成员可以访问,派生类无法通过其基类类型对象来调用基类的protected成员。”
程序代码:
#include "stdafx.h"
#include "iostream"
using namespace std;
class base{
public:
base(int value=0):base_i(value){}
void base_pub(){cout<<"base_pub have been used !"<
protected:
void base_pro(){cout<<"base_pro have been used !"<
private:
int base_i;
};
class derived:public base{
public:
derived(int data=0):derived_i(data){}
void derived_pub(){cout<<"derived_pub have been used: "<
protected:
void derived_pro(){cout<<"derived_pro have been used;"<
private:
int derived_i;
};
int _tmain(int argc, _TCHAR* argv[])
{
base b(1000);
derived d(999);
//b.base_pub();
d.base_pro();
d.derived_pub();
//d.derived_pro();
return 0;
}
编译结果:
1> d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(10) : 参见“base”的声明
1>d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(39) : error C2248: “base::base_pro”: 无法访问 protected 成员(在“base”类中声明)
1> d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(15) : 参见“base::base_pro”的声明
1> d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(10) : 参见“base”的声明
当然程序改动正确的结果是:
#include "stdafx.h"
#include "iostream"
using namespace std;
class base{
public:
base(int value=0):base_i(value){}
void base_pub(){cout<<"base_pub have been used !"<
protected:
void base_pro(){cout<<"base_pro have been used !"<
private:
int base_i;
};
class derived:public base{
public:
derived(int data=0):derived_i(data){}
void derived_pub(){cout<<"derived_pub have been used: "<
protected:
void derived_pro(){cout<<"derived_pro have been used;"<
private:
int derived_i;
};
int _tmain(int argc, _TCHAR* argv[])
{
base b(1000);
derived d(999);
//b.base_pub();
//d.base_pro();
d.derived_pub();
//d.derived_pro();
return 0;
}
程序截图:
这个小程序 大家可以随便修改测试,基本可以做个演示实验的小程序。
好了,还有那些地方不明白就修改程序的哪些地方,看看实践的结果和我这些讲解是不是一样吧。如果有错,你一定要告诉我哦。 谢谢大家。