C++封装;继承;多态在实际编程中体现在哪些方面?

一、封装:使得代码模块化

通过:类内成员变量、成员函数的可访问性来体现

可访问性 通过public、protected、private来限制。

二、继承:扩展已存在的代码,提高代码重用性

体现在基类与派生类之间。

关于继承的难点问题:

  • (1)公有继承、受保护继承、私有继承后,基类中的成员在派生类中的可访问性。
  • (2)多重继承中定义一个派生类对象后,如何为其分配内存(解答:逻辑上可以抽象成一个表格,顺序为:基类1中的虚表指针,其指向基类1中的虚函数;>>基类1中的数据成员;>>基类2中的虚表指针;>>基类2中的数据成员;>>...>>直到派生类数据成员。到此我们会发现一个问题:派生类中的虚函数排在哪呢?解答:在基类1的虚函数之后。由此我们可知:派生类指针与第一个基类指针所指的位置是相同哒
  • (3)派生类不继承基类中的哪些函数?(解答:构造函数、析构函数、拷贝构造函数;重载运算符;友元函数)

三、多态:目的是为了接口重用

C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函数,只有重写了虚函数的才能算作是体现了C++多态性

最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。

因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,这就无法实现一个接口,多种方法的目的了。

 

 

C++封装继承多态作为面向对象编程的核心特性,具有重要意义。 封装旨在实现代码的模块化并增强安全性。通过封装,类以外的程序无法直接访问或修改类的成员,只能通过成员对应的方法来操作,这就是数据封装。同时,封装还隐藏了方法实现的具体细节,仅提供接口,即便内容修改也不会影响外部调用,即方法封装。如此一来,代码的内部实现被保护,外部调用者只需关注接口,提高了代码的可维护性和安全性[^2]。 继承的目的是重用和扩展现有的代码模块。一个类继承另一个类后,会继承其声明的成员和函数,避免了重新定义的麻烦,实现了代码的重用。同时,派生类还能添加自身的属性和方法,从而扩展父类功能。不过,继承也存在一定缺陷,父类的变化会导致子类必须随之改变,增加了代码的耦合性[^2]。 多态则实现了接口的复用,体现为一个接口多种实现。可以用父类型的指针指向子类的实例,然后通过父类指针调用实际子类的成员函数。C++多态性通过虚函数实现,虚函数允许子类重新定义成员函数,这种子类重新定义父类函数的做法称为覆盖或重写。此外,还有编译时多态,主要指方法的重载,在编译器编译期间就能确定函数的调用地址并产生代码,是静态的;运行时多态则通过虚函数在运行时确定调用地址[^2]。 以下是简单示例代码: ```cpp #include <iostream> // 封装示例 class EncapsulationExample { private: int data; // 数据封装 public: EncapsulationExample(int d) : data(d) {} int getData() const { return data; } // 提供接口访问私有成员 void setData(int d) { data = d; } }; // 继承示例 class Base { public: int baseData; Base(int d) : baseData(d) {} void baseFunction() { std::cout << "Base function" << std::endl; } }; class Derived : public Base { public: int derivedData; Derived(int b, int d) : Base(b), derivedData(d) {} void derivedFunction() { std::cout << "Derived function" << std::endl; } }; // 多态示例 class Shape { public: virtual void draw() { std::cout << "Drawing a shape" << std::endl; } }; class Circle : public Shape { public: void draw() override { std::cout << "Drawing a circle" << std::endl; } }; class Square : public Shape { public: void draw() override { std::cout << "Drawing a square" << std::endl; } }; int main() { // 封装测试 EncapsulationExample enc(10); std::cout << "Encapsulated data: " << enc.getData() << std::endl; // 继承测试 Derived der(1, 2); der.baseFunction(); der.derivedFunction(); // 多态测试 Shape* shape1 = new Circle(); Shape* shape2 = new Square(); shape1->draw(); shape2->draw(); delete shape1; delete shape2; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值