首页 > 其他分享 >如何实现接口继承与实现继承的区别?如何处理多态性与性能的平衡?

如何实现接口继承与实现继承的区别?如何处理多态性与性能的平衡?

时间:2024-12-15 15:57:34浏览次数:10  
标签:函数 area 继承 多态性 double 如何 Shape 基类

接口继承与实现继承的区别及实现方式

接口继承(纯虚函数)

在 C++ 中,接口继承主要通过纯虚函数来实现。纯虚函数是在基类中声明的虚函数,它在基类中没有定义,只提供了函数签名,其形式为virtual 返回类型 函数名(参数列表)=0;。例如:

class Shape {
public:
    virtual double area() = 0; 
    virtual double perimeter() = 0;
};
  - 这里的`Shape`类是一个抽象类,不能创建它的对象。它定义了两个纯虚函数`area`和`perimeter`,这两个函数相当于接口。任何继承自`Shape`类的派生类都必须实现这两个函数,否则派生类也会成为抽象类。例如,`Rectangle`类继承自`Shape`类:
     ```cpp
     class Rectangle : public Shape {
     private:
         double length;
         double width;
     public:
         Rectangle(double l, double w) : length(l), width(w) {}
         double area() override {
             return length * width;
         }
         double perimeter() override {
             return 2 * (length + width);
         }
     };

这种继承方式强制派生类遵循基类定义的接口规范,主要用于实现多态性,即通过基类指针或引用调用派生类的函数

实现继承(非纯虚函数)

实现继承是指派生类继承基类的函数实现。当基类中的函数不是纯虚函数时,派生类可以选择继承基类的函数实现,也可以重写(覆盖)它。例如:

class Animal {
public:
    void move() {
        std::cout << "Animal moves." << std::endl;
    }
};
class Dog : public Animal {
public:
    void move() override {
        std::cout << "Dog runs." << std::endl;
    }
};
- 在这个例子中,`Animal`类有一个非纯虚函数`move`。`Dog`类继承自`Animal`类,并且重写了`move`函数。如果`Dog`类没有重写`move`函数,那么当通过`Dog`类对象调用`move`函数时,会调用`Animal`类中的`move`函数实现。
2. **多态性与性能的平衡**
   - **多态性的代价**
     - 多态性主要通过虚函数来实现。当使用虚函数时,C++会在对象的内存布局中添加一个虚函数表(v - table)指针。每次通过基类指针或引用调用虚函数时,需要通过虚函数表来查找真正要调用的函数地址,这会带来一定的运行时开销。例如:
     ```cpp
     Shape* shapePtr;
     Rectangle rect(3, 4);
     shapePtr = &rect;
     shapePtr->area();

在这个例子中,通过shapePtr调用area函数时,需要通过虚函数表查找Rectangle类中area函数的地址,这个查找过程会消耗一定的时间。

性能优化策略

避免不必要的虚函数调用:

如果在某些特定场景下,你确定对象的实际类型,并且不需要多态行为,可以直接通过对象本身来调用函数,而不是通过基类指针或引用。例如:

Rectangle rect(3, 4);
rect.area(); 
- 这种方式避免了虚函数调用的开销。
     - **内联虚函数(有条件使用)**:对于一些简单的虚函数,并且在性能敏感的代码中,可以考虑将其声明为内联函数。不过需要注意的是,编译器是否真正内联函数还要看函数的复杂程度等因素。例如:
     ```cpp
     class Shape {
     public:
         virtual inline double area() = 0; 
     };

但是,对于复杂的多态层次结构和频繁调用的虚函数,内联可能不会起到很好的效果,因为虚函数的多态性本质上还是需要运行时的动态分派。

使用非虚接口(NVI)模式:这种模式将公共接口定义为非虚函数,在非虚函数内部调用虚函数来完成实际的工作。例如:

class Shape {
public:
    double calculateArea() {
        return doArea();
    }
private:
    virtual double doArea() = 0;
};

这样,在calculateArea函数中可以进行一些预处理或者后处理工作,同时通过doArea虚函数保持多态性。并且,对于一些不需要多态的情况,可以直接调用calculateArea函数,减少虚函数调用的开销。

标签:函数,area,继承,多态性,double,如何,Shape,基类
From: https://blog.csdn.net/2202_75941514/article/details/144487928

相关文章

  • 如何设置Linux系统开机自动运行脚本?
    大家好,我是良许。在工作中,我们经常有个需求,那就是在系统启动之后,自动启动某个脚本或服务。在Windows下,我们有很多方法可以设置开机启动,但在Linux系统下我们需要如何操作呢?Linux下同样可以设置开机启动,但可能需要我们敲一些命令(可能也有UI界面的设置方法,但我不熟,我更多是......
  • 什么是内存泄漏?如何避免?
    内存泄漏(memoryleak)是指由于疏忽或错误造成了程序未能释放掉不再使⽤的内存的情况。内存泄漏并⾮指内存在物理上的消失,⽽是应⽤程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。可以使⽤Valgrind,mtrace进⾏内存泄漏检查。有什么类别?(1)堆内存......
  • 如何将网页添加到手机主屏幕?
    在移动设备上,你可以将网页添加到主屏幕,使其以WebApp的形式快速启动。以下是添加网页到手机主屏幕的步骤和代码示例。在移动设备上,将网页添加到主屏幕的功能使得用户可以快速访问他们最常访问的网站,就像使用传统应用程序一样。这种功能被称为“添加到主屏幕”或“WebApp”......
  • 如何处理 MySQL 的主从同步延迟?
    如何处理MySQL的主从同步延迟?MySQL的主从同步延迟通常是由主库与从库之间的网络延迟、从库的处理能力、主库的写操作量等因素导致的。长时间的同步延迟可能会影响系统的稳定性和数据一致性。以下是几种处理和减少MySQL主从同步延迟的方法。1.优化主库性能确保主库的写操......
  • MySQL 中如何进行 SQL 调优?
    MySQL中如何进行SQL调优?SQL调优是提高数据库查询性能的过程,主要目的是减少查询的响应时间和系统的负载。下面是一些常见的SQL调优方法和技巧。1.使用索引索引的使用可以显著提高查询性能。确保常用的查询字段(如WHERE子句中的字段)有索引。避免全表扫描:查询时,尽量避......
  • 如何在 MySQL 中避免单点故障?
    如何在MySQL中避免单点故障?在MySQL中避免单点故障(SPOF,SinglePointofFailure)是确保数据库高可用性和系统稳定性的关键。通过采取以下几种策略,可以最大程度地减少单点故障的风险:1.主从复制(Master-SlaveReplication)MySQL主从复制可以帮助减少单点故障。在主从复制架......
  • 如何在 MySQL 中实现读写分离?
    如何在MySQL中实现读写分离?在MySQL中实现读写分离主要目的是为了提升数据库的性能和扩展性,将读请求和写请求分配到不同的服务器上,减轻主数据库的压力。通常,写请求会发送到主库,而读请求会发送到从库。这样可以通过负载均衡和读写分离技术来提升系统的吞吐量。1.主从复制架构......
  • 什么是 MySQL 的主从同步机制?它是如何实现的?
    什么是MySQL的主从同步机制?它是如何实现的?MySQL的主从同步机制是一种将主数据库(Master)上的数据实时或接近实时地同步到从数据库(Slave)的机制。通过这种机制,从数据库可以获取到主数据库的数据更新并进行复制,从而实现数据的冗余备份、负载均衡和高可用性。主从同步机制的工作原......
  • MySQL 中如果发生死锁应该如何解决?
    MySQL中如果发生死锁应该如何解决?死锁是指多个事务在执行过程中因资源争用形成的循环等待,导致无法继续执行。MySQL会自动检测死锁并选择一个事务进行回滚,但我们可以通过优化设计和操作来避免和解决死锁问题。1.MySQL如何检测死锁?死锁检测:MySQL的InnoDB存储引擎会维护......
  • 如何使用 MySQL 的 EXPLAIN 语句进行查询分析?
    如何使用MySQL的EXPLAIN语句进行查询分析?EXPLAIN是MySQL提供的分析SQL查询执行计划的工具,用于了解查询语句的执行过程,帮助优化查询性能。1.EXPLAIN的使用方法基本语法EXPLAINSELECT*FROMtable_nameWHEREconditions;或者:EXPLAINFORMAT=JSONSELECT*FRO......