面向对象实验(七)——多态性2

简介: 面向对象实验(七)——多态性2

理论

基类类型对象入口索引子类对象

1.泛化的概念:由具体的,个别的扩大为一般的;将此概念应用于结构体和类对象,就是泛化能力。类型泛化指的是在继承和派生时,基类派生出了很多不同的子类,形成了继承树,生成的子类都有自己独特的性质,但是所有的子类都有自己的独特性质,但是所有的子类都具有基类的性质,所以也可以看作是基类对象。

2.不同的子类对象都可以用基类指针索引到,但是如果用统一的方式索引到之后,遇到相同的函数入口,只会执行子类函数中的函数。也就是说,调用基类指针后,虽然指向的是派生类对象,但是调用的仍旧是基类的函数。如果想要调用派生类的话,应当将所有的同名函数设置为虚函数。

基类指针指向子类对象如何展现子类性质:虚函数

1.虚函数的概念:虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。可以实现多态性。

2.动态绑定:虚函数和虚析构函数

含有虚函数的类要使用虚析构函数,否则容易导致派生类的资源无法释放。

派生类的构造函数是先构造的基类的无名对象,析构的时候按照基类的类型析构。

所以也会调用小模块的析构函数。

当基类指针指向派生类对象时,加上virtual就可以调用派生类的析构函数去析构派生类对象。

3.抽象类和纯虚函数

会发现有的类不需要产生对象,只是作为最顶层往下继承,每一个派生类的对象都是调用各自虚函数的函数体,因为基类里虚函数的函数体可以忽略,变成了纯虚函数,同时因为函数体不存在,也不能产生对象,变成了抽象类。

4.派生类构造函数执行的次序:

调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左到右);

调用内嵌成员对象的构造函数,调用顺序按照它们在类中声明的顺序;

派生类的构造函数体中的内容。

代码:

#include<bits/stdc++.h>
#define PI 3.1415926
using namespace std;
class Shape
{
  protected:
    int width,height;
  public:
    Shape(){}
    Shape(int a,int b):width(a),height(b){}
    void set_values(int a,int b){
        width=a;height=b;}
    virtual int area()=0;///纯虚函数
    ~Shape(){}
};
class circle:public Shape///圆
{
  public:
    circle(){}
    circle(int a,int b):Shape(a,b){}
    virtual int area(){
        return width*width*PI;}
};
class Rectangle:public Shape///矩形
{
  public:
    Rectangle(){}
    Rectangle(int a,int b):Shape(a,b){}
    virtual int area(){
        return width*height;}
    ~Rectangle(){}
};
class Triangle:public Shape///三角形
{
  public:
    Triangle(int a,int b):Shape(a,b){}
    virtual int area(){
        return width*height/2;}
    ~Triangle(){}
};
void Print_area(Shape& t1,Shape& t2,Shape& t3){
    Shape* p1=&t1;
    cout<<p1->area()<<endl;
    p1=&t2;
    cout<<p1->area()<<endl;
    p1=&t3;
    cout<<p1->area()<<endl;
}
int main(){
  Shape* p1;
  Rectangle rec_1(10,15);
  Triangle tri_1(10,6);
  circle cir_1(1,1);
    Print_area(rec_1,tri_1,cir_1);
    return 0;
}

输出结果:

150

30

3

目录
相关文章
|
存储 C语言 C++
面向对象实验 ——(二)类与对象
面向对象实验 ——(二)类与对象
114 0
面向对象实验 ——(二)类与对象
面向对象课程设计实验六:重载与多态
面向对象课程设计实验六:重载与多态
|
Java 程序员 C++
《面向对象的思考过程(原书第4版)》一3.5 多重继承
多重继承允许一个类继承自多个类。实际看起来这是个好主意。对象都应该模拟现实世界,不是吗?现实世界中存在很多多重继承的例子。父母是多重继承的一个好例子。每个孩子有一对父母,这是非常自然的事。所以设计类时使用多种继承是有道理的。在一些面向对象的语言中(比如C++中)你可以这样做。
1193 0
《面向对象的思考过程(原书第4版)》一1.10 多态
多态是一个希腊词,字面上理解为许多形状。尽管多态与继承是紧耦合的关系,但它通常单独作为面向对象技术中最强大的优点之一。当向一个对象发送一个消息时,该对象必须定义一个方法来响应这个消息。在继承体系图中,所有的子类从它们的超类中继承接口。
1130 0
|
设计模式 C#
C# 实例解释面向对象编程中的里氏替换原则
版权声明:本文为CSDN博主「Phil Arist」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_41872328/article/details/123457474
126 0
面向对象程序设计第六章:继承
面向对象程序设计第六章:继承
136 0
面向对象程序设计实验五:继承与派生
面向对象程序设计实验五:继承与派生
|
存储 算法 编译器
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
面向对象程序设计第九章:多态
面向对象程序设计第九章:多态
154 0
|
Java
继承性和多态性实验
继承性和多态性实验
102 0

热门文章

最新文章