📜  C++中抽象与封装之间的区别(1)

📅  最后修改于: 2023-12-03 14:59:50.041000             🧑  作者: Mango

C++中抽象与封装之间的区别
什么是抽象?

在C++中,抽象主要指的是面向对象编程中的抽象类。抽象类是一种不能被实例化的类,其中包含了纯虚函数,这些函数没有被实现,只是声明。抽象类可以被用作其他类的基类,其他类可以继承这些纯虚函数。抽象类主要用于在派生类中实现多态性。

什么是封装?

封装是面向对象编程中的一个重要特性,它是指将数据和对数据的操作封装在一个单元中。这个单元可以是一个类,也可以是一个命名空间或者一个库。封装的目的是隐藏组件的内部实现细节,使得客户端只能通过特定的公共接口来访问和使用组件,而不能直接操作组件的内部数据和实现。

区别

抽象和封装都是面向对象编程中的重要特性,它们都可以用来实现数据的隐藏和代码的复用。但是它们的目的和实现方式有所不同。

抽象的主要目的是实现多态性。抽象类是一种特殊的类,它包含了纯虚函数,这些函数没有被实现,只是声明。抽象类可以被用作其他类的基类,在派生类中实现多态性。派生类中实现的函数可以具有不同的实现细节,从而实现多态性。抽象类本身不能实例化,但是可以通过指向派生类对象的指针或引用来访问派生类中实现的函数。

封装的主要目的是隐藏组件的内部实现细节。封装是通过将数据和对数据的操作封装在一个单元中来实现的。这个单元可以是一个类,也可以是一个命名空间或者一个库。封装的目的是隐藏实现细节,使得客户端只能通过特定的公共接口来访问和使用组件,而不能直接操作组件的内部数据和实现。封装可以提高代码的复用性和可维护性,同时也可以提高代码的安全性和稳定性。

代码示例

下面是一个简单的示例,用于说明抽象和封装的区别。

class Abstract {
public:
    virtual void foo() = 0;
};

class Concrete : public Abstract {
public:
    virtual void foo() {
        std::cout << "Concrete::foo()" << std::endl;
    }
}

class Encapsulation {
private:
    int data_;

public:
    Encapsulation(int data) : data_(data) {}

    int get_data() const {
        return data_;
    }

    void set_data(int data) {
        data_ = data;
    }
};

int main() {
    // 抽象
    Concrete c;
    Abstract* ptr = &c;
    ptr->foo();  // Concrete::foo()

    // 封装
    Encapsulation e(42);
    std::cout << e.get_data() << std::endl;  // 42
    e.set_data(87);
    std::cout << e.get_data() << std::endl;  // 87
    return 0;
}

以上代码中,Abstract是一个抽象类,其中包含了一个纯虚函数foo()ConcreteAbstract的一个派生类,实现了foo()函数。在main()函数中,创建了一个Concrete对象,并通过指向Abstract的指针来访问foo()函数,从而实现了多态性。

另一方面,Encapsulation是一个封装类,它将一个整数数据和对数据的操作封装在一个单元中。通过使用get_data()set_data()函数,外部代码可以访问和修改Encapsulation对象内部的数据,但是不能直接访问和修改data_成员变量。这样可以保证组件的内部实现细节被隐藏,从而提高了代码的安全性和稳定性。