C++中的三种访问权限为:public(公有)、private(私有)和protected(保护)。而C++中的三种继承方式为:public继承、private继承和protected继承。下面就为大家详细讲解一下这些内容。
三种访问权限
1. public
public是一个允许最广泛的访问控制级别。在public访问级别下,外部用户可以通过对象(或指向对象的指针)来访问类的所有成员,包括公共数据成员、成员函数和继承来的公有成员。
示例代码:
class Animal {
public:
string name;
void eat() {
cout << "Animal is eating..." << endl;
}
};
// 派生类Dog
class Dog : public Animal {
public:
void bark() {
cout << "Dog is barking..." << endl;
}
};
int main() {
Dog dog;
dog.name = "Tom";
dog.eat();
dog.bark();
return 0;
}
在上述示例中,Animal类中有一个公共数据成员name和一个公共成员函数eat。在Dog类中,使用public继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,通过对象dog的访问权限,外部用户可以访问到Animal类和Dog类中的所有公有成员。
2. private
private访问权限针对类的成员的最严格的访问权限。在private访问级别下,只有类的成员函数和其友元函数才能访问类的私有数据成员和成员函数。外部用户在访问类的私有成员时,会发生编译错误。
示例代码:
class Animal {
private:
int age;
public:
string name;
void eat() {
cout << "Animal is eating..." << endl;
}
};
// 派生类Dog
class Dog : public Animal {
public:
void bark() {
cout << "Dog is barking..." << endl;
}
};
int main() {
Dog dog;
dog.name = "Tom";
dog.age = 4; // 编译错误
return 0;
}
在上述示例中,Animal类中有一个私有数据成员age,也有一个公共数据成员name和一个公共成员函数eat。在Dog类中,使用public继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,但试图访问Animal类中的私有数据成员age时会发生编译错误,因为访问权限受限。
3. protected
protected访问权限的约束位于public和private之间。在protected访问级别下,类的成员函数、类的成员函数所定义的类及其子类才能访问类的保护成员和保护成员函数,外部用户无法直接访问。
示例代码:
class Animal {
protected:
int age;
public:
string name;
void eat() {
cout << "Animal is eating..." << endl;
}
};
// 派生类Dog
class Dog : public Animal {
public:
void bark() {
cout << "Dog is barking..." << endl;
cout << "age=" << age << endl; // 可访问age
}
};
int main() {
Dog dog;
dog.name = "Tom";
dog.age = 4; // 编译错误
return 0;
}
在上述示例中,Animal类中有一个保护数据成员age,也有一个公共数据成员name和一个公共成员函数eat。在Dog类中,使用public继承Animal类,并添加了一个成员函数bark,在其中访问了父类Animal的保护数据成员age。全局main函数中定义了Dog类的一个对象,但试图访问Animal类中的保护数据成员age时会发生编译错误,因为访问权限受限。
三种继承方式
1. public继承
public继承是C++中最常用的继承方式。它表示基类定义的所有公有成员都可以被派生类访问,基类定义的私有成员不能被派生类直接访问,基类定义的保护成员可以被派生类通过继承关系或友元关系访问。
示例代码:
class Animal {
public:
string name;
void eat() {
cout << "Animal is eating..." << endl;
}
};
// 派生类Dog
class Dog : public Animal {
public:
void bark() {
cout << "Dog is barking..." << endl;
}
};
int main() {
Dog dog;
dog.name = "Tom";
dog.eat();
dog.bark();
return 0;
}
在上述示例中,Animal类中有一个公共数据成员name和一个公共成员函数eat。在Dog类中,使用public继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,通过对象dog的访问权限,外部用户可以访问到Animal类和Dog类中的所有公有成员,包括从基类Animal继承过来的成员。
2. private继承
private继承表示基类定义的所有公有成员、保护成员和私有成员都被派生类继承过来,但都变成了派生类的私有成员,外部用户无法访问这些成员。派生类可以通过成员函数访问这些私有成员。
示例代码:
class Animal {
public:
void eat() {
cout << "Animal is eating..." << endl;
}
};
// 派生类Dog
class Dog : private Animal {
public:
void bark() {
cout << "Dog is barking..." << endl;
eat(); // 可以访问父类的公有成员函数
}
};
int main() {
Dog dog;
dog.eat(); // 编译错误,不能访问父类的公有成员函数
return 0;
}
在上述示例中,Animal类中有一个公共成员函数eat。在Dog类中,使用private继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,试图在main函数中访问Dog类继承过来的公有成员函数eat时,会发生编译错误,因为eat函数在Dog类中变成了私有成员。
3. protected继承
protected继承表示基类定义的所有公有成员和保护成员都被派生类继承过来,但都成了派生类的保护成员,外部用户无法访问这些成员。派生类可以通过成员函数或者友元函数访问这些成员。
示例代码:
class Animal {
public:
void eat() {
cout << "Animal is eating..." << endl;
}
};
// 派生类Dog
class Dog : protected Animal {
public:
void bark() {
cout << "Dog is barking..." << endl;
eat(); // 可以访问父类的公有成员函数
}
};
int main() {
Dog dog;
dog.eat(); // 编译错误,不能访问父类的公有成员函数
return 0;
}
在上述示例中,Animal类中有一个公共成员函数eat。在Dog类中,使用protected继承Animal类,并添加了一个成员函数bark。全局main函数中定义了Dog类的一个对象,试图在main函数中访问Dog类继承过来的公有成员函数eat时,会发生编译错误,因为eat函数在Dog类中变成了保护成员。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 的三种访问权限与三种继承方式 - Python技术站