C++超详细知识点(四):类的继承和派生
目录
- 标题:类的继承和派生
- 1. 公有继承
- 2. 保护继承
- 3. 私有继承
- 4. 问题:基类的私有成员在派生类中不可访问,那么怎么才能访问其父类(基类)的私有成员呢?
- (1)使用公有/保护成员函数。
- (2)使用友元函数或友元类。
标题:类的继承和派生
类的继承和派生是一种机制,允许你创建一个新的类(称为子类或派生类),该类继承另一个已存在的类(称为基类或父类)的成员(属性和方法)。这使得你可以在新类中重用已有类的代码,并在其上添加新的功能或修改现有的功能。
例如:
#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;}
};
需要注意的是,尽管上述方法可以实现访问私有成员,但在面向对象的设计中,尽量避免直接访问基类的私有成员,以维护封装性和代码的可维护性。通常情况下,应该通过公有/保护的接口(成员函数)来间接访问基类的私有成员。