C++中的继承

简介: C++中的继承

在C++中,继承是面向对象编程的四大基本特性之一,它允许我们创建一个新的类(派生类),继承另一个类(基类)的属性和方法。通过这种方式,我们可以实现代码的重用,增强代码的可扩展性和可维护性。本文将详细介绍C++中的继承概念、继承方式,并通过示例代码展示其用法。

一、继承的概念

继承允许我们定义一个基类,然后创建一个或多个派生类,这些派生类继承基类的属性和方法。基类又称为父类或超类,派生类又称为子类。通过继承,子类可以拥有父类的所有属性和方法,并且还可以添加自己特有的属性和方法。

在C++中,继承是通过冒号(:)和关键字public、protected、private来实现的。例如:

class Base {
public:
void baseFunc() {
std::cout << "Base function." << std::endl;
}
};
class Derived : public Base {
public:
void derivedFunc() {
std::cout << "Derived function." << std::endl;
}
};

在这个例子中,Derived类通过public继承Base类,从而获得了Base类的baseFunc方法。

二、继承方式

C++提供了三种继承方式:公有继承(public)、保护继承(protected)和私有继承(private)。不同的继承方式会影响基类中成员在派生类中的访问权限。

1. 公有继承(public):基类中的公有成员在派生类中仍为公有成员,保护成员在派生类中仍为保护成员,而私有成员在派生类中是不可访问的。

2. 保护继承(protected):基类中的公有成员和保护成员在派生类中都成为保护成员,而私有成员在派生类中仍然是不可访问的。

3. 私有继承(private):基类中的公有成员和保护成员在派生类中都成为私有成员,而私有成员在派生类中仍然是不可访问的。

三、代码示例

下面是一个使用不同继承方式的代码示例:

#include <iostream>
using namespace std;
// 基类
class Base {
public:
void publicFunc() {
cout << "Base: publicFunc" << endl;
}
protected:
void protectedFunc() {
cout << "Base: protectedFunc" << endl;
}
private:
void privateFunc() {
cout << "Base: privateFunc" << endl;
}
};
// 公有继承
class DerivedPublic : public Base {
public:
void test() {
publicFunc();     // 可访问
// protectedFunc(); // 可访问,但不建议在派生类外部访问保护成员
// privateFunc();   // 不可访问
}
};
// 保护继承
class DerivedProtected : protected Base {
public:
void test() {
// publicFunc();    // 不可在派生类外部访问
protectedFunc();   // 可访问
// privateFunc();   // 不可访问
}
};
// 私有继承
class DerivedPrivate : private Base {
public:
void test() {
// publicFunc();    // 不可在派生类外部访问
// protectedFunc(); // 不可在派生类外部访问
// privateFunc();   // 不可访问
}
};
int main() {
DerivedPublic dp;
dp.test();       // 输出 "Base: publicFunc"
// dp.protectedFunc(); // 错误:'protectedFunc' 在此类中不可访问
// dp.privateFunc();   // 错误:'privateFunc' 在此类中不可访问
// DerivedProtected 和 DerivedPrivate 的 protectedFunc 和 test 方法在这里不可直接访问
// 因为它们不是 public 成员,且没有提供公共接口来调用它们。
return 0;
}

四、继承的层次结构

C++允许形成复杂的继承层次结构,即一个类可以继承自另一个派生类,形成多层继承。此外,C++还支持多重继承,即一个类可以继承自多个基类。但需要注意的是,多重继承可能会引入一些复杂的问题,如命名冲突和菱形继承等,因此在实际应用中需要谨慎使用。

五、总结

继承是C++中非常重要的一个概念,它允许我们创建更加灵活和可维护的代码。通过继承,我们可以实现代码的重用,减少重复劳动,并提高开发效率。然而,在使用继承时,我们也需要注意避免过度继承,保持代码的清晰和简洁。同时,我们还需要了解不同继承方式的影响,以及如何正确地使用它们。

六、虚函数与多态

C++中的继承常与虚函数(virtual functions)和多态(polymorphism)结合使用,实现运行时多态性。虚函数允许在基类中声明一个函数,并在派生类中覆盖(override)该函数。通过基类指针或引用来调用虚函数时,将执行与指针或引用实际指向的对象类型对应的函数版本。

#include <iostream>
using namespace std;
class Base {
public:
virtual void func() {
cout << "Base::func()" << endl;
}
};
class Derived : public Base {
public:
void func() override {
cout << "Derived::func()" << endl;
}
};
int main() {
Base* basePtr = new Base();
Base* derivedPtr = new Derived();
basePtr->func();     // 输出 "Base::func()"
derivedPtr->func();  // 输出 "Derived::func()"
delete basePtr;
delete derivedPtr;
return 0;
}

在这个例子中,Base类有一个虚函数func,Derived类覆盖了该函数。当我们通过基类指针basePtr调用func时,执行的是Base类的func函数;而通过基类指针derivedPtr(但指向Derived类对象)调用func时,执行的是Derived类的func函数。这就是多态性的体现。

七、继承与构造函数

在派生类中,我们可以定义自己的构造函数来初始化派生类特有的成员变量。然而,基类的构造函数不会被派生类的构造函数自动调用。为了在派生类的对象创建时初始化基类部分,我们需要在派生类的构造函数初始化列表中显式地调用基类的构造函数。

class Base {
public:
Base(int value) : baseValue(value) {}
private:
int baseValue;
};
class Derived : public Base {
public:
Derived(int baseVal, int derivedVal) : Base(baseVal), derivedValue(derivedVal) {}
private:
int derivedValue;
};

在这个例子中,Derived类的构造函数通过初始化列表调用了Base类的构造函数来初始化基类部分。

C++的继承机制是面向对象编程的重要组成部分,它使得代码组织更加灵活、易于维护,并促进了代码重用。通过使用继承,我们可以创建具有层次结构的类体系,并通过多态性实现运行时决策。然而,在设计类层次结构时,我们也需要考虑到类之间的关系、访问权限以及潜在的复杂性问题。

相关文章
|
1月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
58 16
|
1月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
52 5
|
3月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
42 1
【C++】继承
|
7月前
|
编译器 C++
【C++】详解C++的继承
【C++】详解C++的继承
|
4月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
112 11
|
4月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
73 1
|
4月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
64 1
|
4月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
34 0
|
4月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
58 0
|
4月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
61 0