对C++继承,封装,多态的理解

用了C++一段时间,感觉对C++慢慢有了一点认识,在这和大家分享一下。

C++是一款面向对象的语言,拥有面向对象语言的三大核心特性:继承,封装,多态。每一个特性的良好理解与使用都会为我们的编程带来莫大的帮助。下面我就这三个特性讲一下我对C++的理解。


继承

      学过面向对象语言的人基本都可以理解什么是继承,但我们为什么要使用继承?

      很多人说继承可以使代码得到良好的复用,当然这个是继承的一个优点,但代码复用的方法除了继承还有很多,而且有些比继承更好。我认为使用继承最重要的原因是继承可以使整个程序设计更符合人们的逻辑,从而方便的设计出想要表达的意思。比如我们要设计一堆苹果,橘子,梨等水果类,使用面向对象的方法,我们首先会抽象出一个水果的基类,而后继承这个基类,派生出具体的水果类。如果要设计的水果很多,我们还可以在水果基类基础上,继续生成新的基类,比如热带水果类,温带水果类,寒带水果类等,而后再继承这些基类。这样的设计思想就相当于人类的分类思想,简单易懂,而且设计出来的程序层次分明,容易掌握。

      既然继承这么好,那该如何使用继承?

      继承虽好但不能滥用,否则设计出来的程序会杂乱不堪。根据上面的介绍,可以发现继承主要用来定义一个东西是什么,比如热带水果是水果,菠萝是热带水果等,即继承主要用来设计一个程序的类的框架,将所要设计的东西用继承来设立一个基本结构。如果想为一个类添加一个行为或格外的功能,最好是使用组合的方式。如果想了解组合的方式,可以看一下比较著名的策略模式。

封装

      封装是什么?

      在C++中,比较狭隘的解释就是将数据与操作数据的方法放在一个类中,而后给每个成员设置相应的权限。从大一点的角度来说,封装就是将完成一个功能所需要的所有东西放在一起,对外部只开放调用它的接口。

       为什么要封装?

       我认为模块化设计是封装的本质原因。

       对软件设计或其他工程设计,特别是比较复杂的工程,一般都是模块化设计。模块化设计的好处就是可以将一个复杂的系统拆分成不同的模块。每一个模块又可以独立的设计,调试,这就让多人一起做一个复杂的工程成为现实。如果想做到模块化设计,封装是不可缺少的一部分。一个好的模块,比如一块inter的CPU芯片,它有强大的功能,虽然我们不知道它内部是如何实现的,但却可以很好的使用它。 

多态

        什么是多态?

        多态简单的说就是“一个函数,多种实现”,或是“一个接口,多种方法”。多态性表现在程序运行时根据传入的对象调用不同的函数。

        C++的多态是通过虚函数来实现的,在基类中定义一个函数为虚函数,该函数就可以在运行时,根据传入的对象调用不同的实现方法。而如果该函数不设为虚函数,则在调用的过程中调用的函数就是固定的。比如下面一个例子

//
//定义一个Duck基类,而后继承Duck派生出一个RedHandDuck类。
//其中display()方法,第一次运行设为普通函数,第二次设为虚函数

#include "iostream"

class Duck {

public:
	Duck(){}
	~Duck(){}

	//定义一个虚函数display
	virtual void display(){

		std::cout<<" I am a Duck !"<<std::endl;
	}
};

class RedHandDuck:public Duck{

public:
	RedHandDuck(){}
	~RedHandDuck(){}

	//重写display
	void display(){

		std::cout<<" I am a RedHandDuck !"<<std::endl;
	}
};

int main(){

	RedHandDuck* duck1 = new RedHandDuck();
	Duck* duck2 = duck1;

	duck1->display();
	duck2->display();

	std::getchar();
}
第一次运行结果(不使用虚函数):


第二次运行结果(使用虚函数):


由结果可以看到,由于虚函数的使用,Duck对象(可以理解为接口),调用的display()方法是根据传入的对象决定的。这就实现了“一个接口,多种方法”。


从网上看到一个关于多态的介绍,非常精辟,分享给大家

  多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。


C++中,继承封装多态面向对象编程的三个基本特征。销售管理系统是一个典型的面向对象程序设计的例子,可以使用C++中的继承封装多态来实现。 1. 继承 继承是指一个可以从另一个继承属性和方法。在销售管理系统中,可以定义一个基Sales,包含一些通用的属性和方法,如销售日期、销售数量、销售金额等。然后定义一些派生,如ProductSales、ServiceSales等,继承Sales,并添加一些特定的属性和方法。 2. 封装 封装是指将数据和方法封装在一个中,对外部隐藏实现细节,只提供公共接口。在销售管理系统中,可以将Sales的属性和方法封装起来,只提供一些公共的接口,如添加销售记录、查询销售记录等。 3. 多态 多态是指同一种操作作用于不同的对象上面,可以产生不同的执行结果。在C++中,可以通过虚函数来实现多态。在销售管理系统中,可以将Sales的某些方法定义为虚函数,然后在派生中重写这些虚函数,以实现不同的执行结果。 下面是一个简单的C++销售管理系统的示例代码: ```cpp #include <iostream> #include <string> using namespace std; class Sales { public: Sales(string date, int quantity, double amount) { this->date = date; this->quantity = quantity; this->amount = amount; } virtual void print() { cout << "Date: " << date << endl; cout << "Quantity: " << quantity << endl; cout << "Amount: " << amount << endl; } protected: string date; int quantity; double amount; }; class ProductSales : public Sales { public: ProductSales(string date, int quantity, double amount, string product) : Sales(date, quantity, amount) { this->product = product; } void print() { cout << "Product: " << product << endl; Sales::print(); } private: string product; }; class ServiceSales : public Sales { public: ServiceSales(string date, int quantity, double amount, string service) : Sales(date, quantity, amount) { this->service = service; } void print() { cout << "Service: " << service << endl; Sales::print(); } private: string service; }; int main() { Sales* sales1 = new ProductSales("2021-01-01", 10,100.0, "Product A"); Sales* sales2 = new ServiceSales("2021-01-02", 5, 50.0, "Service B"); sales1->print(); sales2->print(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值