在C++中,继承是面向对象编程的一个核心概念,它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的属性和方法。通过继承,派生类可以复用基类的代码,同时添加新的属性和方法或重写基类的方法。
基类的数据成员与成员函数
基类可以包含数据成员(属性)和成员函数(方法)。数据成员用于存储对象的状态,而成员函数则定义了对象可以执行的操作。
派生类中的数据成员与成员函数
数据成员:
派生类可以定义自己的数据成员,这些成员与基类的数据成员是独立的。
派生类还可以访问基类的公有(public)和保护(protected)数据成员(如果继承方式是公有或保护继承)。然而,基类的私有(private)数据成员在派生类中是不可访问的。
成员函数:
派生类可以定义自己的成员函数。
派生类可以访问基类的公有和保护成员函数。但是,基类的私有成员函数在派生类中是不可访问的。
派生类可以重写(override)基类的虚函数(virtual function)。虚函数允许派生类提供基类函数的具体实现。
继承中的访问权限
继承方式(公有、保护或私有)决定了基类成员在派生类中的访问权限:
公有继承:基类的公有成员在派生类中仍然是公有的,保护成员仍然是保护的,私有成员仍然是私有的(即不可访问)。
保护继承:基类的公有成员在派生类中变为保护的,保护成员仍然是保护的,私有成员仍然是私有的。
私有继承:基类的公有和保护成员在派生类中均变为私有的,私有成员仍然是私有的。
示例
#include <iostream>
using namespace std;
// 基类
class Base {
public:
int publicBaseMember;
protected:
int protectedBaseMember;
private:
int privateBaseMember;
public:
void baseFunction() {
cout << "Base function" << endl;
}
protected:
void protectedFunction() {
cout << "Protected function" << endl;
}
private:
void privateFunction() {
cout << "Private function" << endl;
}
};
// 派生类
class Derived : public Base {
public:
int derivedMember;
void accessBaseMembers() {
publicBaseMember = 10; // 可以访问
protectedBaseMember = 20; // 可以访问
// privateBaseMember = 30; // 不可访问
baseFunction(); // 可以调用
protectedFunction(); // 可以调用,但在这里没有直接调用以展示
// privateFunction(); // 不可调用
}
void derivedFunction() {
cout << "Derived function" << endl;
}
};
int main() {
Derived d;
d.publicBaseMember = 5; // 可以通过派生类对象访问基类公有成员
// d.protectedBaseMember = 15; // 不可通过派生类对象直接访问保护成员
// d.privateBaseMember = 25; // 不可通过派生类对象访问基类私有成员
d.baseFunction(); // 可以调用基类公有成员函数
// d.protectedFunction(); // 不可调用基类保护成员函数(除非在派生类中有访问路径)
// d.privateFunction(); // 不可调用基类私有成员函数
d.derivedFunction(); // 可以调用派生类成员函数
d.accessBaseMembers();
return 0;
}
在这个例子中,Derived 类从 Base 类公有继承。因此,Derived 类可以访问 Base 类的公有和保护成员,但不能访问私有成员。此外,Derived 类还定义了自己的数据成员 derivedMember 和成员函数 derivedFunction。