纯虚函数的学习和使用

  老师的要求是给出shape类,派生出梯形,圆形,正方形和矩形4个类,然后根据他们的面积进行排序并且输出相应的信息。

  一开始我遇到了一个问题,我没有将4个派生类定义成数组,导致定义出来的某个类对象使用完之后就被抹除了,从而导致原先的基类指针数组的指向丢失。纯虚函数的工作原理就是指针指向这个类,所以这个类必须用数组保存起来,一旦被覆盖,指针的指向就会出现丢失或者紊乱的情况,但是经过我的观察,他好像指向最后 一次定义的对象,而是好像都是,但是具体里面是怎样实现的有待考究 。当时我还是一位是构造函数的问题,又写了set函数,又把构造删了之类的,后来发现完全不是这里的问题,而且这个地方的排序交换,我定义的id数组去模拟,而且直接交换指针对象也可以。

一组样例如下:

5
c 3
r 2 1
s 5
s 2
t 1 2 5

代码如下:

#include<iostream>
using namespace std;
#define pi 3.14
class Shape{
public:
    virtual double area() = 0;
    virtual void show() = 0;
};
class Rec:public Shape{
private:
    int l,w;
public:
    void set(int ll,int ww){
        l = ll,w = ww;
    }
    double area(){
        return l*w;
    }
    void show(){
        cout<<"the rec‘s area = "<<area()<<endl;
    }
};
class Square:public Shape{
private:
    int l;
public:
    void set(int ll){
        l = ll;
    }
    double area(){
        return l*l;
    }
    void show(){
        cout<<"the Square‘s area = "<<area()<<endl;
    }
};
class Circle:public Shape{
private:
    int r;
public:
    void set(int rr){
        r = rr;
    }
    double area(){
        return pi*r*r;
    }
    void show(){
        cout<<"the Circle‘s area = "<<area()<<endl;
    }
};
class Tixing:public Shape{
private:
    int l,w,h;
public:
    void set(int ll,int ww,int hh){
        l = ll,w = ww;
        h = hh;
    }
    double area(){
        return (l+w)*h/2;
    }
    void show(){
        cout<<"the Tixing‘s area = "<<area()<<endl;
    }
};
int main(){
    int t,l,w,h;
    Square s1[110];
    Rec r1[110];
    Tixing t1[110];
    Circle c1[110];
    char op[10];
    Shape *s[110];
    int id[110];
    cin>>t;
    for(int i = 0;i < t;i++){
        cin>>op;
        if(op[0] == ‘s‘){
            cin>>l;
            s1[i].set(l);
            s[i] = &s1[i];
        }
        else if(op[0] == ‘r‘){
            cin>>l>>w;
            r1[i].set(l,w);
            s[i] = &r1[i];
        }
        else if(op[0] == ‘c‘){
            cin>>l;
            c1[i].set(l);
            s[i] = &c1[i];
        }
        else {
            cin>>l>>w>>h;
            t1[i].set(l,w,h);
            s[i] = &t1[i];
        }
        id[i] = i;
    }
    for(int i = 0;i < t;i++){
        for(int j = 0;j < t;j++){
            if(s[id[i]]->area() < s[id[j]]->area())
                swap(id[i],id[j]);
        }
    }
    for(int i = 0;i < t;i++){
        s[id[i]]->show();
    }
    return 0;
}

  

时间: 2024-12-19 09:16:56

纯虚函数的学习和使用的相关文章

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

C++ Primer学习笔记(14)——虚函数的实现机制、纯虚函数

在行文之前查阅了相关书籍,参考了一些别人的博客,在这里谢谢大家的分享!希望自己和大家在学习语言的道路上渐行渐远,一直走下去~~~ 上一篇文章中说道,C++ 的三个基本特质是 封装.继承.多态. 多态性是将接口与实现进行分离.用形象的语言解释就是实现已共同的方法,但因个体差异而采用不同的策略. 多态包括静多态和动多态,分别在编译和运行过程中实现.而动多态是由虚函数来实现的,其实现机制体现了C++的神秘性. 1.虚函数的实现机制 虚函数是那些以 virtual 关键字修饰的成员函数,是用来实现多态的

C++ Primer 学习笔记_70_面向对象编程 --纯虚函数、容器与继承

面向对象编程 --纯虚函数.容器与继承 I.纯虚函数 在函数形参后面写上 =0 以指定纯虚函数: class Disc_item : public Item_base { public: double net_price(size_t) const = 0; //指定纯虚函数 }; 将函数定义为纯虚函数能够说明,该函数为后代类型提供了可以覆盖的接口,但是这个类的版本绝不会调用.重要的是,用户将不能创建Disc_item类型的对象. Disc_item discount; //Error Bulk

C++学习基础十二——纯虚函数与抽象类

一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个类中含有虚函数,则必须将该类的析构函数声明为虚函数. 4.虚函数与纯虚函数的声明: virtual void draw();//虚函数 virtual void draw() = 0;//纯虚函数 5.C++中支持两种多态性: 编译时多态:通过重载函数实现. 运行时多态:通过虚函数实现. 二.Jav

C++学习之路:纯虚函数

背景: 当有些方法无法继承,或者说无意义的时候,例如shape类,那么基类的接口便无法实现. 那么这时候就需要引入纯虚函数. 几何基类:       Shape 拥有Draw方法,三角,圆形,菱形等Draw方法各不相同.只能使用纯虚函数, 拥有纯虚函数的基类称为抽象类,抽象类无法被实例化,纯虚函数也不需要实现. @纯虚函数的定义 #纯虚函数一般不需要实现.   @抽象类   作用:抽象类作为抽象和设计的目的而声明,将有关的数据和行为组织在一个集成层次结构中,保证派生类具有要求的行为.   对于暂

C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类

类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. 1 //单继承的定义 2 class B:public A 3 { 4 < 派生类新定义成员> 5 }; 6 //多继承的定义 7 class C:public A,private B 8 { 9 < 派生类新定义成员> 10 }; 我们这篇主要说单继承. 派生类共有三种C++类继承方式: 公有继承(public) 基类的公有成员和保护成

学习笔记---C++虚函数,纯虚函数

1 .虚函数 假设people是man的父类,people类和man类都定义了实函数walk() people* p = new man(); p->walk(); 这里P执行的是people类的walk()函数.这和java语言不一样,java在这里执行的是man的walk()函数.那么C++如何实现子类的方法重写,并动态定位到子类方法? 这里必须使用virtual关键字 定义父类和子类的walk() virtual void walk(); 现在执行 p->walk();就是执行的子类的w

C++ Primer 学习笔记_70_面向对象编程 -纯虚函数、器皿与继承

面向对象编程 --纯虚函数.容器与继承 I.纯虚函数 在函数形参后面写上 =0 以指定纯虚函数: class Disc_item : public Item_base { public: double net_price(size_t) const = 0; //指定纯虚函数 }; 将函数定义为纯虚函数能够说明,该函数为后代类型提供了可以覆盖的接口,但是这个类的版本绝不会调用.重要的是,用户将不能创建Disc_item类型的对象. Disc_item discount; //Error Bulk

静态成员函数与pthread_create,纯虚函数匹配使用实例

最近在浏览朋友写的代码,发现有一个细节非常值得学习,在这里将代码贴出来简单分享一下: #ifndef THREAD_H_ #define THREAD_H_ #include <pthread.h> #include <stdexcept> #include "Copyable.h" /* * 这个线程类是个抽象类,希望派生类去改写它 */ class Thread : public Copyable{ public: Thread(); virtual ~Th