精华内容
下载资源
问答
  • 抽象类至少有一个纯虚函数
    2022-03-30 10:42:15

    前言

    本文由纯虚函数和抽象类引出工厂模式,继承与多态的内容到达本篇,也基本介绍完了。

    纯虚函数概念

    纯虚函数(pure virtual function)是指被标明为不具体实现的虚拟成员函数。它用于这样的情况:定义一个基类时,会遇到无法定义基类中虚函数的具体实现,其实现依赖于不同的派生类。

    定义纯虚函数的一般格式为:

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

    “=0”表明程序员将不定义该函数,函数声明是为派生类保留一个位置。“=0”本质上是将指向函数体的指针定为NULL。

    抽象类的概念

    首先要了解到:含有纯虚函数的基类是不能用来定义对象的。
    纯虚函数没有实现部分,不能产生对象,所以含有纯虚函数的类是抽象类。

    1. 带有纯虚函数的类称为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。

    2. 抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。

    3. 抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类。

    4. 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了。

    示例
    实在不理解抽象类,那么可以这样想:
    面向对象设计的类,其目的是为了模拟现实,普通的类意思就是,可以模拟实现动物,家具等具体事物;那么抽象类所模拟的示例有:社会,生活,打工等。
    比如有人说,C++太难了,我还是去工地搬砖吧,这样的行为可以用普通的类模拟,设计出搬砖这种类;但有人说,C++太难了,我不学了想去混社会,这个就无法模拟实现出来了,所以就叫做抽象类。

    类的分类

    在经过继承和多态的学习后,可以总结出类可以分为下面这些:

    普通类

    有数据,有方法的类

    class Object
    {
    private:
    	string name;
    public:
    	void Print()const {}
    };
    

    继承,有虚函数的类

    在继承中基类有虚函数,派生类实现基类虚方法,程序运行时产生动态联编的情况

    class Object
    {
    private:
    	string name;
    public:
    	virtual void Print()const {}
    };
    
    class Base : public Object
    {
    private:
    	int num;
    public:
    	virtual void Print()const {}
    };
    

    抽象类

    基类中有纯虚函数,派生类必须实现基类的纯虚函数的情况,称为抽象类。

    class Object
    {
    private:
    	string name;
    public:
    	void add() {}
    	virtual void Print()const = 0;
    };
    
    class Base : public Object
    {
    private:
    	int num;
    public:
    	virtual void Print()const {
    		cout << "..." << endl;
    	}
    };
    

    interface(接口)

    在一个抽象类中,只有方法类的集合,即只有纯虚函数的类叫做interface。
    在派生类中,必须要重写所有的方法,不然这个派生类也是抽象类。

    struct Object
    {
    	virtual void Print() = 0;
    	virtual void Add() = 0;
    	virtual void fun() = 0;
    };
    

    总结

    抽象类的规定
    (1)抽象类只能用作其他类的基类,不能建立抽象类对象。
    (2)抽象类不能用作参数类型、函数返回类型或显式转换的类型。
    (3)可以定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。

    虚函数和纯虚函数区别

    1. 类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样的话,这样编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。

    2. 虚函数在子类里面也可以不重载的;但纯虚函数必须在子类去实现,这就像Java的接口一样。通常把很多函数加上virtual,是一个好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,因为很难预料到父类里面的这个函数不在子类里面不去修改它的实现。

    3. 带纯虚函数的类叫虚基类,这种基类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。这样的类也叫抽象类。抽象类和大家口头常说的虚继承基类还是有区别的,在C#中用abstract定义抽象类,而在C++中有抽象类的概念,但是没有这个关键字。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。

    虚基类:“virtual”继承的类,也就是说任何类都可以成为虚基类。
    抽象类:至少包含一个纯虚函数的类,其不能被实例化,哪怕该纯虚函数在该类中被定义。二者没有任何联系。

    虚基类就是解决多重多级继承造成的二义性问题。

    更多相关内容
  • 纯虚函数抽象类

    2019-05-30 18:51:05
    在很多情况下,存在基类中虚函数无法给出具体实现代码的情况,如写一个空的函数体,这就引出了虚函数的概念。 纯虚函数在声明时要在函数原型的后面赋0,其声明格式如下: virtual <返回值类型> <函数名&...

    纯虚函数

    • 纯虚函数:例如动态联编的示例中的虚函数virtual float area(){ return 0; },无法给出具体的函数实现,所以固定返回0。在很多情况下,存在基类中虚函数无法给出具体实现代码的情况,如写一个空的函数体,这就引出了虚函数的概念。
    • 纯虚函数在声明时要在函数原型的后面赋0,其声明格式如下:
      virtual <返回值类型> <函数名>(<参数表>)=0;
      函数声明为纯虚函数后,就不用给出具体的定义。

    抽象类

    • 抽象类是一种特殊的类,自身无法实例化,即自身无法定义对象,主要是作为基类派生出新的类,并且使得所有派生出来的类都保留统一的接口操作。
    • 如果一个类中至少包含一个纯虚函数,这个类就被称为抽象类,抽象类特点如下:
      (1).抽象类至少包含一个没有给出具体实现的纯虚函数,抽象类无法实例化,不能定义对象;
      (2).抽象类不能作为形参类型,函数返回类型或转换类型,但是可以定义抽象类指针和引用指向公有派生对象,实现动态多态性;
      (3).在抽象类中也可以定义普通成员函数和虚函数,仍然可以通过派生类对象来调用这些不是纯虚函数的函数;
      (4).不允许从非抽象类(即不包含纯虚函数的类)派生出抽象类。
    #include <iostream>
    
    using namespace std;
    
    //动态联编-虚函数 
    class Shape{     //Shape基类中有纯虚函数,为抽象类 
    	int x;
    	int y;
    	public:
    		Shape(int px,int py):x(px),y(py)
    		{
    			cout<<"construct Shape"<<endl;
    		}
    		virtual float area()=0;   //纯虚函数 
    
    };
    
    class Rectangle:public Shape{
    	int w;
    	int h;
    	public:
    		Rectangle(int px,int py,int pw,int ph):Shape(px,py),w(pw),h(ph)
    		{
    			cout<<"construct Rectangle"<<endl;
    		}
    		float area()
    		{
    			return w*h;
    		}
    };
    
    class Circle:public Shape{
    	int r;
    	public:
    		Circle(int px,int py,int pr):Shape(px,py),r(pr)
    		{
    			cout<<"construct Circle"<<endl;
    		}
    		float area()
    		{
    			return 3.14*r*r;
    		}
    };
    int main()
    {
    	Rectangle a(30,40,4,8);
    	Circle b(30,40,4);
    	Shape *p=&a;
    	cout<<a.area()<<endl;
    	cout<<p->area()<<endl;
    	p=&b;
    	cout<<b.area()<<endl;
    	cout<<p->area()<<endl;
    	return 0;
    }
    
    

    运行结果:
    /

    展开全文
  • 纯虚函数抽象类

    2020-08-22 12:36:31
    (每一个有函数,在该对象的内存的第一块就是存放的虚函数表的地址) 在使用基类指针指向派生对象时,需要将基类的析构函数添加virtual关键字,将其变为虚析构函数。(否则在删除基类指针指向的额派生...

    纯虚函数和抽象类

    注意:

    • 多态实现的关键是虚函数表。(每一个有虚函数的类,在该类对象的内存的第一块就是存放的虚函数表的地址)

    • 在使用基类指针指向派生类对象时,需要将基类的析构函数添加virtual关键字,将其变为虚析构函数。(否则在删除基类指针指向的额派生类对象时,只会调用基类的析构函数,会造成内存泄漏)

    • 在抽象类的成员函数内部可以调用纯虚函数(多态),而在构造和析构函数内部不能调用纯虚函数(非多态,抽象类中的该函数无函数体,不可调用)

    1.纯虚函数与抽象类

    C++中的纯虚函数(或抽象函数)是我们没有实现的虚函数!我们只需声明它! 通过声明中赋值0来声明纯虚函数!

    // 抽象类
    Class A {
    public: 
        virtual void show() = 0; // 纯虚函数
        /* Other members */
    }; 
    
    • 纯虚函数:没有函数体的虚函数
    • 抽象类:包含纯虚函数的类

    抽象类只能作为基类来派生新类使用,不能创建抽象类的对象,抽象类的指针和引用->由抽象类派生出来的类的对象!

    代码样例:test.cpppure_virtual.cpp

    2.实现抽象类

    抽象类中:在成员函数内可以调用纯虚函数,在构造函数/析构函数内部不能使用纯虚函数。

    如果一个类从抽象类派生而来,它必须实现了基类中的所有纯虚函数,才能成为非抽象类。

    // A为抽象类
    class A {
    public:
        virtual void f() = 0;  // 纯虚函数
        void g(){ this->f(); }
        A(){}  // 构造函数
    };
    
    class B : public A{
    public:
        void f(){ cout<<"B:f()"<<endl;}  // 实现了抽象类的纯虚函数
    };
    

    代码样例:abstract.cpp

    3.重要点

    // 抽象类至少包含一个纯虚函数
    class Base{
    public: 
        virtual void show() = 0; // 纯虚函数
        int getX() { return x; } // 普通成员函数
    
    private:
         int x; 
    }; 
    
    class Derived : public Base { 
    public: 
        void show() { cout << "In Derived \n"; } // 实现抽象类的纯虚函数
        Derived(){} // 构造函数
    }; 
    
    int main(void) 
    { 
        //Base b;  // error! 不能创建抽象类的对象
        //Base *b = new Base(); error!
        
        Base *bp = new Derived(); // 抽象类的指针和引用 -> 由抽象类派生出来的类的对象
        bp->show();
        return 0; 
    }
    
    // Derived为抽象类
    class Derived: public Base 
    { 
    public: 
    //    void show() {}
    }; 
    
    // 抽象类
    class Base { 
        protected: 
            int x; 
        public: 
            virtual void fun() = 0; 
            Base(int i) { x = i; }  // 构造函数
    }; 
    // 派生类
    class Derived: public Base 
    { 
        int y; 
    public: 
        Derived(int i, int j) : Base(i) { y = j; } // 构造函数
        void fun() { cout << "x = " << x << ", y = " << y; }
    }; 
    
    // 抽象类
    class Base  {
    public:
        Base(){ cout << "Constructor: Base" << endl; }
        virtual ~Base(){ cout << "Destructor : Base" << endl; }
        
        virtual void func() = 0;
    };
    
    class Derived: public Base {
    public:
        Derived(){ cout << "Constructor: Derived" << endl; }
        ~Derived(){ cout << "Destructor : Derived" << endl;}
        
        void func(){cout << "In Derived.func()." << endl;}
    };
    

    当基类指针指向派生类对象并删除对象时,我们可能希望调用适当的析构函数。
    如果析构函数不是虚拟的,则只能调用基类析构函数。

    展开全文
  • 主要介绍了C++纯虚函数抽象类的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
  • 包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数。抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针。像在开发程序的过程中,...

    包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数。抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针。像在开发程序的过程中,并不是所有代码都是由软件构造师自己写的,有时候需要调用库函数,有时候分给别人来写。一名软件构造师可以通过纯虚函数建立接口,然后让程序员填写代码实现接口,而自己主要负责建立抽象类。

    纯虚函数

    纯虚函数是指被标明为不具体实现的虚成员函数,它不具备函数的功能。
    许多情况下,在基类中不能给虚函数一个有意义的定义,这时可以在基类中将它说明为纯虚函数,而其实现留给派生类去做。纯虚函数不能被直接调用,仅起到提供一个与派生类相一致的接口的作用。
    声明纯虚函数的形式如下:
    virtual 类型 函数名(参数列表)=0;
    纯虚函数不可以被继承。当基类是抽象类时,在派生类中必须给出基类中纯虚函数的定义,或者在该类中再声明其为纯虚函数。只有在派生类中给出了基类中所有纯虚函数的实现时,该派生类才不再成为抽象类。

    例子:
    创建纯虚函数

    #include<iostream>
    using namespace std;
    
    class Figure
    {
    public:
    	virtual double getArea() = 0;
    };
    
    const double PI = 3.14;
    
    class Circle:public Figure
    {
    private:
    	double Radius;
    	
    public:
    	Circle(double R)
    	{
    		Radius = R;
    	}
    	double getArea()
    	{
    		return Radius * Radius * PI;
    	}
    };
    
    class Rectangle:public Figure
    {
    protected:
    	double Height,Width;
    
    public:
    	Rectangle(double height,double width)
    	{
    		Height = height;
    		Width = width;
    	}
    	double getArea()
    	{
    		return Height * Width;
    	}
    };
    
    int main()
    {
    	Figure *fg1;
    	fg1 = new Rectangle(4.0,5.0);
    	cout << fg1->getArea() << endl;
    	delete fg1;
    	Figure *fg2;
    	fg2 = new Circle(4.0);
    	cout << fg2->getArea() << endl;
    	delete fg2;
    	return 0;
    }
    

    注意:
    对于包含纯虚函数的类来说,是不能够实例化的,“Figure figure;”是错误的。
    结果:
    image.png
    程序定义了矩形类Rectangle和圆形类Circle,两个类都派生于图形类Figure。图形类是一个在现实生活中不存在的对象,抽象类面积的计算方法不确定,所以,将图形类Figure的面积计算方法设置为纯虚函数,这样圆形有圆形面积的计算方法,矩形有矩形面积的计算方法,每个继承自Figure的对象都有自己的面积,通过getArea成员函数就可以获取面积值。

    实现抽象类中的成员函数

    抽象类通常用于作为其他类的父类,从抽象类派生的子类如果不是抽象类,则子类必须实现父类中的所有纯虚函数。

    例子:

    #include<iostream>
    using namespace std;
    
    class CEmployee
    {
    public:
    	int m_ID;
    	char m_Name[128];
    	char m_Depart[128];
    	virtual void OutputName() = 0;  //定义抽象成员函数
    };
    
    class COperator:public CEmployee
    {
    public:
    	char m_Password[128];
    	void OutputName()  //实现父类中的纯虚成员函数
    	{
    		cout << "Operator's name:" << m_Name << endl;
    	}
    	COperator()
    	{
    		strcpy(m_Name,"Johnson");
    	}
    };
    
    class CSystemManager:public CEmployee
    {
    public:
    	char m_Password[128];
    	void OutputName()  //实现父类中的纯虚成员函数
    	{
    		cout << "SystemManager's name:" << m_Name << endl;
    	}
    	CSystemManager()
    	{
    		strcpy(m_Name,"Johnson666");
    	}
    };
    
    int main()
    {
    	CEmployee *pWorker;
    	pWorker = new COperator();
    	pWorker->OutputName();
    	delete pWorker;
    	pWorker = NULL;
    	pWorker = new CSystemManager();
    	pWorker->OutputName();
    	delete pWorker;
    	pWorker = NULL;
    	return 0;
    }
    

    结果:
    image.png
    程序中从CEmployee类派生了两个子类,分别为COperator和CSystemManager。这两个类分别实现了父类的纯虚成员函数OutputName。同样的一条语句“pWorker->OutputName();”,由于pWorker指向的对象不同,其行为也不同。

    展开全文
  • 有时,由于我们不知道实现,因此无法在基类中提供...C++中的纯虚函数(或抽象函数)是虚函数我们可以实现,但是我们必须在派生类中重写该函数,否则派生类也将成为抽象类(有关我们在哪里为此类函数提供实现的更多信
  • C++里的抽象类纯虚函数

    千次阅读 2016-09-12 09:57:45
    C++里的抽象类纯虚函数在C++中,含有至少一个纯虚函数的类是抽象类,但是注意在C++中没有abstract这个关键字,所以C++里面的抽象类无需添加abstract这个单词。抽象类不可以直接实例化,也就是不能直接用抽象类来...
  • C++抽象类纯虚函数

    2021-04-14 01:43:03
    如果是这种情况,那么 C++ 语言允许程序员将该函数声明为一个纯虚函数,也就是,一个中没有提供实现的成员函数。C++ 声明一个纯虚函数的方法是将表达式 =0 放在声明中,而函数的主体则不存在。例如,如果要将...
  • C ++中的抽象类纯虚函数 (Abstract Class and Pure Virtual Function in C++) Abstract Class is a class which contains atleast one Pure Virtual function in it. Abstract classes are used to provide an ...
  • 1.纯虚函数抽象类   C++中的纯虚函数(或抽象函数)是我们没有实现的虚函数!我们只需声明它! 通过声明中赋值0来声明纯虚函数! // 抽象类 Class A { public: virtual void show() = 0; // 纯虚函数 /* Other ...
  • 系列文章目录 第章 c++继承 ...虚析构函数5.final成员函数和类三、抽象类纯虚函数1.抽象类2.纯虚函数总结 前言 最近在准备研究生复试,学习c++,就当作是学习笔记了 、类继承层次中对象之间的
  • C++ 抽象类 纯虚函数定义  纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0” 二、引入原因: 1、为了方便...
  • C++中,如果希望有一个公共基类只声明一个函数接口,在该公共基类不进行定义,而是在派生才重新定义;重新定义时,不同的派生重新定义不同的功能,则这种情况下,最好使用C++的纯虚函数和派生。(最后面源...
  • 总结 纯虚函数(或抽象函数)是我们没有实现的虚函数...如果一个类从抽象类派生而来,它必须实现了基类中的所有纯虚函数,才能成为非抽象类。 重要点 纯虚函数使一个类变成抽象类 抽象类类型的指针和引用 如果我们不
  • 2.如果一类含有至少一个纯虚函数,那么该类就是一个抽象类抽象类不能被实例化为对象 3.除了构造函数和析构函数以外全部成员函数都是纯虚函数抽象类叫做纯抽象类,亦称接口类 #include <iostream> using ...
  • 要是一个类成为抽象类,这个类应具有的条件是 至少有一个函数,这句话对吗?
  • 4.纯虚函数 5.抽象类 6.虚基类 1.虚函数的引入 先看如下程序,程序后进一步的解释。如果读者对程序不懂请先复习基础知识。 // // VirtualFun.cpp // virtual // // Created by 刘一丁 on 2019/8/26. // ...
  • 多态3、虚析构函数4 、纯虚函数抽象类①、纯虚函数②、抽象类(包含纯虚函数) 、继承 1、继承概念 在原有类的基础上派生出新的类,新类继承原有类的属性和方法,称原有的类为基类, 又称为父类。由已存在的类...
  • 一、基本概念 1、虚函数 在的成员函数前冠以 virtual 关键字的函数叫做虚函数。虚函数是实现运行时多态的基础,可以像普通函数一样被重载,也可以在派生中被...如果一个类至少有一个纯虚函数,那么这个...
  • 目录 抽象类 纯虚函数 抽象类 ● 抽象类: 不用于定义对象而只作为一种基本类型用做继承的类... 我们在实际中为了强调一个类是抽象类, 可将该类的构造函数声明为 保护的访问控制权限, 这样我们就不能 在类外...
  • 而虚含数是动态绑定的,在运行时才知道和哪个绑定2)虚函数覆盖的版本,必须和该函数在基类中的原始版本一样,即函数名,形参名,常属性一样3)如果基类中的虚函数返回类型的指针(A*)或引用(A&),那么允许子类覆盖...
  • c++纯虚函数抽象类

    2020-01-14 11:16:10
    纯虚函数是在声明虚函数时被“初始化”为0的函数。声明纯虚函数的一般形式是 virtual 函数类型 函数名 ... ③这是一个声明语句,最后应有分号。 纯虚函数只有函数的名字而不具备函数的功能,不能被调用。它只是...
  • 什么是虚函数? 那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因...
  • 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态。...多态可以让父类的指针“多种形态”,这是种泛型技术。(所谓泛型技术,就是试图使用不变的代码来实现可变的算法)。 2. 虚函数 2.1虚函数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,142
精华内容 2,856
关键字:

抽象类至少有一个纯虚函数