纯虚函数的学习和使用

Posted icode-xiaohu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯虚函数的学习和使用相关的知识,希望对你有一定的参考价值。

  老师的要求是给出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;
}

 

  

以上是关于纯虚函数的学习和使用的主要内容,如果未能解决你的问题,请参考以下文章

纯虚函数的学习和使用

c++中的纯虚函数机制如何从DLL中暴露函数

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

一个例子搞懂C++的虚函数和纯虚函数

C++纯虚函数和抽象类

C++ 纯虚函数和抽象类