精华内容
下载资源
问答
  • c++抽象类的作用
    千次阅读
    2020-08-07 11:15:25

    在C++中,如果一个类中含有纯虚析构,那么这个类就是抽象类。

    定义一个纯虚析构

    virtual 修饰的函数为虚析构,虚析构=0则为纯虚析构

    那么抽象类有什么用呢?比如在父类中定义了吃水果蔬菜,那么具体是吃什么呢?猴子可能喜欢吃香蕉,兔子可能喜欢吃萝卜。这都有一个具体点,就是吃东西,但是具体吃什么父类是不能把这种单独的放到“共有的”这个里面,具体吃什么由子类决定。这时候父类设置一个抽象类。表明这个功能没有实现,交给子类自己实现。

    更多相关内容
  • 抽象类(abstract class)和接口(interface)的概念是面向对象设计中常用的概念, 也是比较容易混淆的概念. 在这里, 我提出一种区分它们的思路
  • C++学习——抽象类

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

    1 、抽象类

    • C++抽象类是为子类抽象一个基类,抽象类的主要作用是为子类提供相同的属性和方法,其他如果需要在子类中修改方法,需要将其声明为纯虚函数。
    • 含有一个及以上纯虚函数的类为抽象类
      需要注意:抽象类虽然不能创建自己的对象,但是可以有自己的指针
    class controller
    {
    	public:
    		controller();
    		void func() = 0; // 纯虚函数,意味着这是一个抽象类
    	protected:
    		int x;
    		int y;
    };
    int main()
    {
    	controller MPCController; //错误,抽象类不能有自己的对象
    	controller *p_controller; //正确,抽象类可以有自己的指针
    }
    

    虽然抽象类创建了一个抽象类指针,但是该指针依然不能指向自己,只能用来动态的指向子类对象。

    注意

    (1)如果子类中没有实现纯虚函数,而只是继承基类的纯虚函数,则这个子类仍然还是一个抽象类。
    (2)如果子类中给出了基类纯虚函数的实现,则该子类就不再是抽象类,可以建立对象。

    展开全文
  • 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.只有类中的虚函数才能被声明为纯虚函数,普通成员函数和顶层函数均不能声明为纯虚函数

    展开全文
  • 5. C++ 抽象类

    千次阅读 2020-11-29 19:44:10
    C++中,含有纯虚拟函数的类称为抽象类, 它不能生成对象 ;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。 抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当...
  • C++抽象类的继承

    2022-04-19 22:13:39
    先定义一个抽象类shape,方法getArea()还未实现 class shape { public: double getArea(); private: double width; double height; public: shape(double width, double height) { this->width=width; ...
  • 该资源是博主博客的源代码,博客上有详细讲解Qt/C++关于纯虚函数和抽象基类原理讲解和示例用法解释,博客地址如下: https://blog.csdn.net/naibozhuan3744/article/details/94488200 其中编译环境为QtCreator4.5.0...
  • C++ 抽象类 (abstract class)

    千次阅读 多人点赞 2021-05-31 12:20:38
    C++ 抽象类 (abstract class). 抽象类是什么, 以及抽象类和具体类的区别.
  • c++抽象类

    千次阅读 多人点赞 2019-04-22 15:36:54
    一、纯虚函数和抽象类 前面我们介绍了什么是虚函数,即在某些方法前加上关键字virtual,表示该方法在子类中会被重写。 在一个虚函数的声明语句的分号前加上 =0,就可以将一个虚函数变成纯虚函数,其中,=0只能出现在...
  • 纯虚函数是一种特殊的虚函数,它的一般格式如下:  class <... class point//抽象类 { public: point(int i=0, int j=0) { x0=i; y0=j; } virtual void set() = 0;//纯虚函数 virtual void draw
  • c++抽象类和抽象类指针笔记

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

    2022-01-04 21:47:44
    抽象类与接口类的区别
  • 搞懂C++抽象类

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

    2013-01-05 20:32:23
    一个student,lectureTeatre,继承抽象module,通过继承来实现接口
  • C++ 接口和抽象类

    2022-03-26 20:34:52
    1、C++ 语言中没有抽象类的概念,可通过纯虚函数来实现抽象类,定义了一个或多个纯虚函数的类称为抽象类; 2、抽象类可以包括抽象函数,抽象函数指的是没有具体内容的函数,一般用"= 0"修饰; 3、可以同时包括普通的...
  • 接口 抽象类 C++

    千次阅读 2022-01-09 17:07:54
    (2)抽象类作用抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。所以派生类实际上刻画了一组子类的操作...
  • C++抽象类详解

    千次阅读 2020-05-21 09:58:26
    在介绍抽象类之前,我们先介绍一下纯虚函数。 1.纯虚函数 在基类中仅仅给出声明,不对虚函数实现定义,而是在派生类中实现。这个虚函数称为纯虚函数。普通函数如果仅仅给出它的声明而没有实现它的函数体,这是编译...
  • C++ 接口(抽象类

    2021-01-03 05:25:16
    C++ 接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现。 C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个...
  • 设计一个抽象类Vehicle,由它派生出类Car和类Truck,类Car包含名称、颜色和载客数三个数据成员,类Truck包含名称、颜色和载重量三个数据成员。使用如下函数测试你的程序:
  • 为什么说虚函数是C++最重要的特性之一呢,因为虚函数承载着C++中动态联编的作用,也即多态,可以让程序在运行时选择合适的成员函数。虚函数必须是的非静态成员函数(且非构造函数),其访问权限是public。那么: ...
  • C++抽象类的实现

    千次阅读 2017-07-11 15:45:55
    答:抽象类的主要作用就是为它所组织的继承层次结构提供一个公共的基类,这样它就具有公有行为的特征,其它派生的类可以从这个公共的基类中继承和实现接口,通过抽象类多态的使用其中的成员函数。 抽象类案例: #...
  • 描述C++抽象类的使用以及虚函数、纯虚函数的用法
  • c++中的抽象类是怎么定义的

    千次阅读 2020-11-03 11:27:45
    c++中含有纯虚函数的类是抽象类,纯虚函数是是在函数的原型后添加=0 在面向对象的概念中,我们知道所有的对bai象都是通过du类来描绘的,但是反过来却不是这样。zhi并不是所有的类都是用来描绘对象的,如果一个类...
  • C++抽象类小览

    千次阅读 2015-08-02 09:23:51
    virtual 方法和 virtual 可以说是c++语言的一大特性,甚至有人说是c++语言的精髓,其实这么说也是有一定道理的,因为运行时多态在c++中体现淋漓尽致,而 virtual 就是为多态服务的。这也是一个一定要搞懂的c++问题...
  • C.126: An abstract class ...C.126:抽象类通常不需要构造函数‍ Reason(原因) An abstract class typically does not have any data for a constructor to initialize. 抽象类通常不包含任何需要构造函数...

空空如也

空空如也

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

c++抽象类的作用