在此前的例子里,我们无论是Animal,Pig和Turtle类里的所有成员都是用public:语句声明。
所谓访问控制,就是C++提供了一种用来保护类里的方法和属性的手段
这里所说的保护的意思是对谁可以调用某个方法和访问某个属性加上一个限制。如果某个对象试图调用一个它无权访问的函数,编译器将报错。
我们看下C++的访问级别:
级别 | 允许谁来访问 |
public | 任何代码 |
protected | 这个类本身和它的子类 |
private | 只有这个类本身 |
利用访问级别来保护类里的方法和属性很简单,只要在类里的某个地方写出一个访问级别并在其后加上一个冒号,从那个地方开始往后的所有方法和属性都将受到相应的保护,直到遇到下一个访问级别或者到达这个类的末尾为止!
#include <iostream>
#include <string>
class Animal
{
protected:
std::string mouth;
std::string name;
Animal(std::string theName);
void eat();
void sleep();
};
class Pig : public Animal
{
public:
void climb();
Pig(std::string theName);
};
class Turtle : public Animal
{
public:
void swim();
Turtle(std::string theName);
};
Animal::Animal(std::string theName)
{
name = theName;
}
Pig::Pig(std::string theName) : Animal(theName)
{
}
Turtle::Turtle(std::string theName) : Animal(theName)
{
}
void Animal::eat()
{
std::cout << "I'm eatting!" << std::endl;
}
void Animal::sleep()
{
std::cout << "T'm sleeping!" << std::endl;
}
void Pig::climb()
{
std::cout << "我会爬树!" << std::endl;
}
void Turtle::swim()
{
std::cout << "我会游泳!" << std::endl;
}
int main()
{
Pig pig("小猪猪");
Turtle turtle("小甲鱼");
pig.name = "小甲鱼" << std::endl;
std::cout << "这只猪的名字是:" << pig.name << std::endl;
std::cout << "我看的视频的作者是:" << turtle.name << std::endl;
return 0;
}
这样就报错了,因为上面的访问控制变成了protected。
但是我有一点不懂,用了protected这个不是可以用在它和它的子类吗?这里的pig是它的Pig子类的对象啊,为啥不行?
明白了,这属于外部代码了,不能用了
课后提问:
class Pig : public Animal{...}
这里的public是什么意思?
- public
是在告诉编译器:继承的方法和属性的访问级别不发生任何改变,即public仍可以被所有代码访问,protected只能由基类和其子类访问,private则只能由基类本身访问。
- protected
如果原来是public的话,把基类的访问级别改为protected。这将使得这个子类外部的代码无法通过子类去访问基类中的public。
-private
是在告诉编译器从基类继承来的每一个成员都当成private来对待,这意味着只有这个子类可以使用它从基类继承来的元素。