目录
标题:类的继承和派生
类的继承和派生是一种机制,允许你创建一个新的类(称为子类或派生类),该类继承另一个已存在的类(称为基类或父类)的成员(属性和方法)。这使得你可以在新类中重用已有类的代码,并在其上添加新的功能或修改现有的功能。
例如:
#include <iostream>
// 基类(父类)
class Animal
{
public:
void eat() {
std::cout << "Animal is eating." << std::endl;
}
void sleep() {
std::cout << "Animal is sleeping." << std::endl;
}
};
// 派生类(子类),继承自 Animal
class Dog : public Animal
{
public:
void bark() {
std::cout << "Dog is barking." << std::endl;
}
};
int main() {
// 创建派生类的对象
Dog myDog;
// 使用继承自基类的方法
myDog.eat();
myDog.sleep();
// 新功能:调用派生类独有的方法
myDog.bark();
return 0;
}
●继承的类型有三种:公有继承(public)、保护继承(protected)、私有继承(private)。
在上述的例子中,我们使用的是公有继承(public Animal),这意味着基类的公共成员在子类中仍然是公共的。通常情况下,公有继承是最常见的类型,因为它维护了基类成员的可访问性。
1. 公有继承
使用 public 关键字表示,如 class Dog: public Animal。
基类的公共成员在派生类中保持为公共成员,基类的保护成员在派生类中变为保护成员。
基类的私有成员在派生类中不可直接访问。基类的私有成员对于派生类是不可见的。
2. 保护继承
使用 protected 关键字表示,如 class Derived : protected Base。
基类的公共成员和保护成员在派生类中都变为保护成员。
基类的私有成员在派生类中不可直接访问。基类的私有成员对于派生类是不可见的。
3. 私有继承
使用 private 关键字表示,如 class Derived : private Base。
基类的公共成员和保护成员在派生类中都变为私有成员。
基类的私有成员在派生类中不可直接访问。基类的私有成员对于派生类是不可见的。
例如:
class Base
{
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
class Derived : public Base //公有继承
{
// publicMember 是公共的
// protectedMember 变为派生类的保护成员
// privateMember 在派生类中不可访问
};
class Derived : protected Base { //保护继承
// publicMember 变为派生类的保护成员
// protectedMember 变为派生类的保护成员
// privateMember 在派生类中不可访问
};
class Derived : private Base { //私有继承
// publicMember 变为派生类的私有成员
// protectedMember 变为派生类的私有成员
// privateMember 在派生类中不可访问
};
4. 问题:基类的私有成员在派生类中不可访问,那么怎么才能访问其父类(基类)的私有成员呢?
(1)使用公有/保护成员函数。
在基类中提供公有或保护的成员函数,通过这些函数来访问私有成员。派生类可以调用这些函数来访问私有成员。
class Base
{
private:
int privateMember;
public:
void setPrivateMember(int value) {
privateMember = value;
}
int getPrivateMember() const {
return privateMember;
}
};
class Derived : public Base
{
public:
void accessPrivateMember() {
setPrivateMember(42); // 通过公有成员函数设置私有成员的值
int value = getPrivateMember(); // 通过公有成员函数获取私有成员的值
}
};
(2)使用友元函数或友元类。
可以在基类中声明派生类为友元类,从而让派生类能够直接访问基类的私有成员。
class Derived; // 前向声明,不然Base中无法识别到该类,类的声明必须在使用之前。
class Base
{
private:
int privateMember;
// 声明 Derived 为友元类
friend class Derived;
};
class Derived : public Base
{
public:
void accessPrivateMember() {
// 可以直接访问基类的私有成员
Base::privateMember = 42;
}
};
需要注意的是,尽管上述方法可以实现访问私有成员,但在面向对象的设计中,尽量避免直接访问基类的私有成员,以维护封装性和代码的可维护性。通常情况下,应该通过公有/保护的接口(成员函数)来间接访问基类的私有成员。
标签:知识点,派生,私有,成员,派生类,C++,public,基类,class From: https://blog.csdn.net/qq_48361010/article/details/136646950