大家好,今天主要和大家聊一聊,如何实现C++中继承和重载的功能。
第一:C++中的继承功能
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。在 Qt 里大量的使用 了这种特性,当 Qt 里的类不满足自己的要求时,我们可以重写这个类,就是通过继承需要重写的类,来实现自己的类的功能。
1. 公有继承(public):当一个类派生继承公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
2. 保护继承(protected): 当一个类派生继承保护基类时,基类的公有和保护成员将成为派
生类的保护成员。
3. 私有继承(private):当一个类派生继承私有基类时,基类的公有和保护成员将成为派生类
的私有成员。
#include <iostream> #include <string> using namespace std; /*动物类,抽象出下面两种属性, *颜色和体重,是每种动物都具有的属性 */ class Animal { public: /* 颜色成员变量 */ string color; /* 体重成员变量 */ int weight; }; /*让狗类继承这个动物类,并在狗类里写自己的属性。 *狗类拥有自己的属性 name,age,run()方法,同时也继承了 *动物类的 color 和 weight 的属性 */ class Dog : public Animal { public: string name; int age; void run(); }; int main() { Dog dog; dog.name = "旺财"; dog.age = 2; dog.color = "黑色"; dog.weight = 120; cout<<"狗的名字叫:"<<dog.name<<endl; cout<<"狗的年龄是:"<<dog.age<<endl; cout<<"狗的毛发颜色是:"<<dog.color<<endl; cout<<"狗的体重是:"<<dog.weight<<endl; return 0; }
Animal 作为基类,Dog 作为派生类。Dog 继承了 Animal 类。访问修饰符为 public (公有继承)。
第二:C++中的函数重载
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。我们不能仅通过返回类型的不同来重载函数。在 Qt 源码里,运用了大量的函数重载,所以我们是有必要学习一下什么是函数重载。不仅在 C++,在其他语言的里,都能看见函数重载。因为需要不同,所以有重载各种各样的函数。下面通过一个小实例来简单说明一下函数重载的用法。我们还是以狗类为说明,现在假设 有个需求。我们需要打印狗的体重,分别以整数记录旺财的体重和小数记录旺财的体重,同时以整数打印和小数打印旺财的体重。那么我们可以通过函数重载的方法实现这个简单的功能。
#include <iostream> #include <string> using namespace std; class Dog { public: string name; void getWeight(int weight) { cout<<name<<"的体重是:"<<weight<<"kG"<<endl; } void getWeight(double weight) { cout<<name<<"的体重是:"<<weight<<"kG"<<endl; } }; int main() { Dog dog; dog.name = "旺财"; dog.getWeight(10); dog.getWeight(10.5); return 0; }
分析:以相同的函数名getWeight,不同的参数类型double weight,这样构成了函数重载。
第三:C++中运算符重载
#include <iostream> #include <string> using namespace std; class Dog { public: int weight; Dog operator+(const Dog &d) { Dog dog; dog.weight = this->weight + d.weight; return dog; } }; int main() { Dog dog1; Dog dog2; Dog dog3; dog1.weight = 10; dog2.weight = 20; dog3 = dog1 + dog2; cout<<"第三只狗的体重是:"<<dog3.weight<<endl; return 0; }
分析:重装"+"运算符,把Dog对象作为传递,然后返回dog对象。