精华内容
下载资源
问答
  • c++抽象类
    2022-04-19 22:13:39

    先定义一个抽象类shape,方法getArea()还未实现

    class shape {
    public:
        virtual double getArea()=0;
    private:
        double width;
        double height;
    public:
        shape(double width, double height) {
            this->width=width;
            this->height=height;
        }
    
    public:
        double getWidth() const {
            return this->width;
        }
    
        void setWidth(double width) {
            this->width=width;
        }
    
        double getHeight() const {
            return this->height;
        }
    
        void setHeight(double height) {
            this->height=height;
        }
    };

    然后定义一个Rectangle类继承shape类,在类中实现shape的虚函数getArea()

    class rectangle: public shape {
    public:
        double getArea() {
            return this->getWidth()*this->getHeight();
        }
        rectangle(double width, double height) : shape(width, height) {}
    };

    最后在main函数中实现

    #include <iostream>
    #include "rectangle.h"
    
    int main() {
        rectangle *r= new rectangle(4, 5.5);
        std::cout<<r->getArea()<<std::endl;
        std::getchar();
    }
    

    输出是22

    更多相关内容
  • C++抽象类

    千次阅读 2021-06-09 00:09:18
    概念在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类抽象类往往用来表...

    概念

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

    抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
    通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类(即:包含至少一个纯虚函数的类)称为抽象类,它不能生成对象。派生自抽象类的类必须实现纯虚函数或者它们必须也是抽象类。

    抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。

    抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
    参考来源

    class Account {
    public:
       Account( double d );   
       virtual double GetBalance();   
       virtual void PrintBalance() = 0;   
    private:
        double _balance;
    };
    
    

    此声明与上一个声明的唯一区别是,PrintBalance 是用 pure 说明符 (= 0) 声明的。

    抽象类特点

    1. 抽象类不能直接实例化,并且对抽象类使用 new 运算符会导致编译时错误;

    2. 抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们;

    3. 重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能包括普通的方法。

    限制

    • 变量或成员数据

    • 显式转换的类型

    • 自变量类型

    • 显式转换的类型

    • 函数返回类型

    可以为抽象类定义纯虚函数,但是只能通过使用以下语法直接调用:

    抽象类名称::函数名称()

    这有助于设计基类包括纯虚析构函数的类层次结构,因为在销毁对象的过程中始终会调用基类析构函数。请考虑以下示例:

    // 用纯虚函数声明一个抽象基类.
    // deriv_RestrictionsonUsingAbstractClasses.cpp
    class base {
    public:
        base() {}
        virtual ~base()=0;
    };
    
    // Provide a definition for destructor.
    base::~base() {}
    
    class derived:public base {
    public:
        derived() {}
        ~derived(){}
    };
    
    int main() {
        derived *pDerived = new derived;
        delete pDerived;
    }
    
    

    删除 pDerived 指向的对象时,将调用类 derived 的析构函数,然后调用类 base的析构函数。纯虚函数的空实现确保至少函数的某个实现存在。

    在前面的示例中,纯虚函数 base::~base 是从 derived::~derived 隐式调用的。

    也可使用完全限定的成员函数名称显式调用纯虚函数。

    参考链接

    C++接口与抽象类

    接口是一个概念。它在C++中用抽象类来实现,在C#和Java中用interface来实现。

    与抽象类的关系

    • 包含未实现的方法声明;

    • 不能实例化;

    • 派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)。

    与抽象类的区别

    - 抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。

    • 抽象类是对象的抽象,然而接口是一种行为规范。

    • 抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(static final)。

    • 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法; 而类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。

    声明:

    本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

    展开全文
  • C++ 抽象类

    千次阅读 2020-10-01 15:04:00
    C++接口时通过抽象类实现的,设计抽象类的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类本类不能被用于实例化对象,只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。 因此,如果一个...

    抽象类(接口)

    接口描述了类的行为和功能,而无需完成类的特定实现

    C++接口时通过抽象类实现的,设计抽象类的目的,是为了给其他类提供一个可以继承的适当的基类.抽象类本类不能被用于实例化对象,只能作为接口使用

    注意:
    如果试图实例化一个抽象类的对象,会导致编译错误
    因此,如果一个抽象类的派生类需要被实例化(建立对象),则必须对每个继承来的纯虚函数进行函数体实现.
    如果没有在派生类中重写所有纯虚函数,就尝试实例化派生类的对象,也会导致编译错误,这是因为如果派生类没有实现父类的纯虚函数,则派生类变为抽象类

    抽象类基类为派生自抽象基类的派生类提供了约束条件,即派生类必须要实现继承自抽象基类中的纯虚函数,否则此派生类不可进行实例化,且派生类将继承为抽象派生类


    抽象类与纯虚函数(抽象方法)

    纯虚函数是一个在 基类中声明的虚函数,它在该基类中没有定义具体的函数体(操作内容),要求派生类根据实际需要定义自己的版本,设计多层次类继承关系时用到。把某个方法声明为一个抽象方法等于告诉编译器,这个方法必不可少,但目前在基类中还不能为它提供实现

    纯虚函数的标准格式:

    virtual 函数类型 函数名(参数表)=0;

    class Pet
    {
    public:
    virtual void func()=0;//这便是声明了一个纯虚函数 也就是在虚函数尾部加上" =0 " 一个虚函数便被声明成为了一个纯虚函数
    // 等于0表示该函数仅声明而没有函数体
    };
    

    🌟注意:一旦类中有了纯虚函数,这个类便被称为 抽象类,且此类不可被实例化(不可建立类对象实例)
    例如:

    int main()
    {
    Pet pet;//报错!带有纯虚函数的类称为抽象类,不可实例化
    }
    

    抽象类
    抽象类只能作为基类使用,无法定义抽象类对象实例,这是因为抽象类中包含了没有定义的纯虚函数,在C++中,我们把只能用于被继承而不能直接创建对象的类称之为抽象类,这种基类不能直接生成对象,而只有被继承后,并重写其虚函数后,才能使用

    当抽象类的派生类实现了继承而来的纯虚函数后,才能实例化对象

    之所以要存在抽象类,最主要是因为它具有不确定因素,我们把那些类中的确存在,但是在父类中无法确定具体实现的成员函数称为虚函数。虚函数是一种特殊的函数,在抽象类中只有声明,没有具体的定义

    抽象类和纯虚函数的关系
    抽象类中至少存在一个纯虚函数,存在纯虚函数的类一定是抽象类,存在纯虚函数是成为抽象类的充要条件


    为什么需要一个抽象类

    让我们借助现实生活中的例子来理解这一点。让我们说我们有一个基类Animal,它会睡觉,发出声音等等。现在我只考虑这两个行为并创建一个具有两个函数sleep()和sound()的基类Animal

    此时我们有猫和狗两种动物需要被赋予发出声音的属性,我们知道动物的声音是不同的,猫说“喵”,狗说“汪”,那么我在Animal类中为函数sound()提供了什么实现?这样做的唯一和正确的方法是使这个函数纯粹抽象,这样我就不需要在Animal类中给出实现但是所有继承Animal的类必须为此函数提供实现。这样我确保所有动物都有声音,而且它们有独特的声音

    程序示例:

    #include <iostream>
    
    using namespace std;
    
    //todonew与delete动态分配内存,与用指针调用对象 通过对象的不同调用不同的同名虚函数
    class Pet//声明纯虚函数sound 后Pet类变为抽象类(接口)
    {
    public:
    	Pet(string thename);
    	void sleep();
    	virtual void sound()=0;//声明纯虚函数sound  (并未进行函数实现 函数实现放在派生类中)
    	
    	//注意:					   
        //todo1.继承自抽象基类Pet的子类必须全部实现基类中的所有纯虚函数
    	//todo2.抽象基类Pet不可进行实例化
    
    protected:
    	string name;
    };
    
    class Cat :public Pet
    {
    public:
    	Cat(string thename);
    	void climb();
    	void sound();
    };
    
    class Dog :public Pet
    {
    public:
    	Dog(string thename);
    	void jump();
    	void sound();
    };
    
    
    Pet::Pet(string thename)//todo基类构造器(抽象类也有构造函数)
    {
    	name = thename;
    }
    
    void Pet::sleep()
    {
    	cout << name << "正在睡大觉\n";
    }
    
    void Pet::sound()
    {
    	cout << name << "动物发声\n";
    }
    
    Cat::Cat(string thename) :Pet(thename)//派生类Cat构造函数
    {
    }
    
    void Cat::climb()
    {
    	cout << name << "正在爬树\n";
    }
    
    void  Cat::sound()//派生类虚函数
    {
    
    //	Pet::sound();//todo如果需要调用基类中的play()函数  在原本的play()函数的基础上加上覆盖上的子类play()函数
    	cout << name << "喵喵喵!\n";
    }
    
    
    Dog::Dog(string thename) :Pet(thename)//派生类Dog构造函数
    {
    }
    
    void Dog::jump()
    {
    	cout << name << "跳过了栅栏\n";
    }
    
    void Dog::sound()//派生类虚函数
    {
    //	Pet::sound();
    	cout << name << "汪汪汪!\n";
    }
    
    void func(Pet* x)
    {	
    	x->sound();
    }
    
    
    int main()
    {
    //	Pet pet;//todo用带有抽象方法(纯虚函数)的抽象类Pet无法实例化对象
    
    	//todo创建指向子类实例的基类指针和引用来调用纯虚函数
    	Pet* cat = new Cat("猫");
    	Pet* dog = new Dog("狗");
    
    	//todo创建对象实例来调用纯虚函数
    	Cat cat2("对象实例调用 猫");
    	cat2.sound();
    
    	func(cat);
    	func(dog);
    	return 0;
    }
    
    

    本例中定义了三个类,它们的继承关系为:Animal-->CatAnimal-->Dog
    Animal是一个抽象类,也是最顶层的基类,在 Animal类中定义了一个纯虚函数sound(),在Cat类中,实现了sound()函数。所谓实现,就是定义了纯虚函数的函数体,抽象类Animal虽然不能实例化,但它为派生类提供了约束条件,派生类必须要实现这个函数,完成动物发声功能,否则就不能对派生类进行实例化

    在实际开发中,你可以定义一个抽象基类,只完成部分功能,未完成的功能交给派生类去实现(谁派生谁实现). 这部分未完成的功能,往往是基类不需要的,或者在基类中无法实现的,虽然抽象基类没有完成,但是却强制要求派生类完成,这就是抽象基类的“霸王条款”
    运行结果:
    在这里插入图片描述


    总结:🎯

    1.我们已经看到任何具有纯虚函数的类都是抽象类
    2.抽象类基类不可建立实例
    3.抽象类派生出的子类需将继承的纯虚函数全部进行实例化,才能建立其实例
    4.抽象类可以有构造函数
    5.如果派生类没有实现父类的纯虚函数,则派生类变为抽象类,即不可建立其实例
    6.抽象基类除了约束派生类的功能,还可以实现多态,可以创建指向子类的实例的抽象基类的指针和引用
    7.只有类中的虚函数才能被声明为纯虚函数,普通成员函数和顶层函数均不能声明为纯虚函数

    展开全文
  • c++抽象类

    千次阅读 多人点赞 2019-04-22 15:36:54
    一、纯虚函数和抽象类 前面我们介绍了什么是虚函数,即在某些方法前加上关键字virtual,表示该方法在子类中会被重写。 在一个虚函数的声明语句的分号前加上 =0,就可以将一个虚函数变成纯虚函数,其中,=0只能出现在...

    一、纯虚函数和抽象类

    前面我们介绍了什么是虚函数,即在某些方法前加上关键字virtual,表示该方法在子类中会被重写。

    在一个虚函数的声明语句的分号前加上 =0,就可以将一个虚函数变成纯虚函数,其中,=0只能出现在类内部的虚函数声明语句处。纯虚函数只用声明,而不用定义,其存在就是为了提供接口,含有纯虚函数的类是抽象基类.纯虚函数必须在子类中被重写。!!!


    二、抽象类的特点

    1.含有纯虚函数的类被称为抽象类。抽象类只能作为派生类的基类,不能定义对象

    2.在定义纯虚函数时,不能定义虚函数的实现部分

    3.抽象类的唯一用途是为派生类提供基类,纯虚函数的作用是作为派生类中的成员函数的基础,并实现动态多态性。继承于抽象类的派生类如果不能实现基类中所有的纯虚函数,那么这个派生类也就成了抽象类。因为它继承了基类的抽象函数,只要含有纯虚函数的类就是抽象类。纯虚函数已经在抽象类中定义了这个方法的声明,其它类中只能按照这个接口去实现。


    三、接口和抽象类的区别

    1)C++中我们一般说的接口,表示对外提供的方法,提供给外部调用。是沟通外部跟内部的桥梁。也是以类的形式提供的,但一般该类只具有成员函数,不具有数据成员

    2)抽象类可以既包含数据成员又包含方法。

    代码演示:

    抽象类IShape作为基类:只有头文件,没有实现文件,因为我写的该抽象类中只有纯虚函数,没有其他的一般方法。

    #ifndef SHAPE_H
    
    #define SHAPE_H
    
    #include
    
    using std::string;
    
    //interface
    
    class IShape
    
    {
    
    public:
    
    virtual float getArea()=0; //纯虚函数,获得面积
    
    virtual string getName()=0; //纯虚函数,返回图形的名称
    
    };
    
    #endif
    

    派生类Circle类继承自抽象类IShape:
    Circle.h头文件:

    #ifndef CIRCLE_H
    #define CIRCLE_H
    #include"Shape.h"
    class CCircle : public IShape //公有继承自IShape类
    {
    public:
    CCircle(float radius); //构造函数
    public:
    virtual float getArea(); //实现声明实现两个基类的函数,声明的时候需要加virtual关键字,实现的时候就不需要加virtual关键字了。
    virtual string getName();
    private:
    float m_fRadius; //派生类可以拥有自己的成员
    };
    #endif
    

    Circle.cpp实现文件:

    #include"Circle.h"
    
    CCircle::CCircle(float radius)
    
    :m_fRadius(radius) //使用构造函数的初始化列表初始化
    
    {
    
    }
    
    float CCircle::getArea() / /实现实现两个基类的函数
    
    virtual string getName();
    
    {
    
    return 3.14 * m_fRadius * m_fRadius;
    
    }
    
    string CCircle::getName()
    
    {
    
    return "CCircle";
    
    }
    

    派生类Rect类继承自抽象类IShape:

    Rect.h头文件:

    #ifndef RECT_H
    
    #define RECT_H
    
    #include"shape.h"
    
    class CRect : public IShape
    
    {
    
    public:
    
    CRect(float nWidth, float nHeight);
    
    public:
    
    virtual float getArea();
    
    virtual string getName();
    
    private:
    
    float m_fWidth; //矩形类具有自己的两个属性,宽和高
    
    float m_fHeight;
    
    };
    

    Rect.cpp实现文件:

    #include"Rect.h"
    
    CRect::CRect(float fWidth, float fHeight)
    
    :m_fWidth(fWidth), m_fHeight(fHeight)
    
    {
    
    }
    
    float CRect::getArea()
    
    {
    
    return m_fWidth * m_fHeight;
    
    }
    
    string CRect::getName()
    
    {
    
    return "CRect";
    
    }、
    

    测试文件main.cpp:

    #include
    
    #include"Rect.h"
    
    #include"Circle.h"
    
    using namespace std;
    
    int main()
    
    {
    
    IShape* pShape = NULL; //定义了一个抽象类的指针,注意抽象类不能定义对象但是可以定义指针
    
    pShape = new CCircle(20.2); //基类指针指向派生类的对象
    
    cout<getName()<<" "<getArea()<<endl;
    
    delete pShape; //释放了CCirle对象所占的内存,但是指针是没有消失的,它现在就是一个野指针,我们在使用之前必须对它赋值
    
    pShape = new CRect(20, 10); //基类指针指向派生类的对象
    
    cout<getName()<<" "<getArea()<<endl;
    
    return 0;
    
    }
    
    展开全文
  • 5. C++ 抽象类

    千次阅读 2020-11-29 19:44:10
    C++中,含有纯虚拟函数的类称为抽象类, 它不能生成对象 ;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。 抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当...
  • 抽象类(abstract class)和接口(interface)的概念是面向对象设计中常用的概念, 也是比较容易混淆的概念. 在这里, 我提出一种区分它们的思路
  • C++ 抽象类 (abstract class)

    千次阅读 多人点赞 2021-05-31 12:20:38
    C++ 抽象类 (abstract class). 抽象类是什么, 以及抽象类和具体类的区别.
  • 该资源是博主博客的源代码,博客上有详细讲解Qt/C++关于纯虚函数和抽象基类原理讲解和示例用法解释,博客地址如下: https://blog.csdn.net/naibozhuan3744/article/details/94488200 其中编译环境为QtCreator4.5.0...
  • c++抽象类和抽象类指针笔记

    千次阅读 2020-06-20 21:14:47
    抽象类: 不能用来定义对象而只作为一种基本类型用作继承的类,称为抽象类,由于它常用作基类,通常称为抽象基类。凡是包含纯虚函数的类都是抽象基类。因为纯虚函数是不能够被调用的,包含纯虚函数的类是无法建立...
  • 搞懂C++抽象类

    2020-04-16 23:44:06
    ​作者:良知犹存 转载授权以及围观:欢迎添加微信:Allen-Iverson-me-LYN ...在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成...
  • c++抽象类继承

    2013-01-05 20:32:23
    一个student,lectureTeatre,继承抽象module,通过继承来实现接口
  • c++ 抽象类为什么要实现虚析构?

    千次阅读 2020-03-19 10:22:11
    c++ 抽象类为什么要实现虚析构? 这个问题是面试官经常会问的 可能c++基础不扎实的会懵逼 连什么是抽象类都不清楚 什么是抽象类? 先看一下抽象类的定义 抽象类:声明了纯虚函数的类,都成为抽象类 主要特点:抽象类...
  • C++抽象类和接口的区别

    千次阅读 2020-07-17 13:49:08
    抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。 接口 如果一个类里面只有纯虚函数,没有其他成员函数和数据成员,就是接口类。 既然有抽象类
  • c++抽象类的简单示例

    2019-09-19 22:06:08
    /* * 抽象类示例 */ #include <stdlib.h> #include <iostream> using namespace std; /* * AbstractClass是抽象类 */ class Abstrac...
  • C++抽象类的实现

    千次阅读 2017-07-11 15:45:55
    1、什么是抽象类? 答:简单的说,抽象类就是至少有一个纯虚函数的类。 2、抽象类的作用? 答:抽象类的主要作用就是为它所组织的继承层次结构提供一个公共的基类,这样它就具有公有行为的特征,其它派生的类可以...
  • C++抽象类小览

    千次阅读 2015-08-02 09:23:51
    virtual 方法和 virtual 可以说是c++语言的一大特性,甚至有人说是c++语言的精髓,其实这么说也是有一定道理的,因为运行时多态在c++中体现淋漓尽致,而 virtual 就是为多态服务的。这也是一个一定要搞懂的c++问题...
  • C#程序设计-3期(KC008) KC008110100020-C#接口和C++抽象类一样吗?.docx 学习资料 复习资料 教学资源
  • 描述C++抽象类的使用以及虚函数、纯虚函数的用法
  • C++学习——抽象类

    千次阅读 2022-07-31 16:04:44
    C++抽象类学习
  • C++抽象类和接口类

    2022-01-04 21:47:44
    抽象类与接口类的区别
  • 关于C++抽象类建立对象的问题

    千次阅读 2017-02-04 10:18:06
    抽象类是无法建立对象、但可以定义指针、该指针可以指向它的派生类,进而实现多态性
  • 设计一个抽象类Vehicle,由它派生出类Car和类Truck,类Car包含名称、颜色和载客数三个数据成员,类Truck包含名称、颜色和载重量三个数据成员。使用如下函数测试你的程序:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 208,273
精华内容 83,309
关键字:

c++抽象类

友情链接: 5.zip