c++-纯虚函数和抽象类

纯虚函数和抽象类

  • C面向接口编程和C多态

    • 函数类型语法基础
    • 函数指针做函数参数(回调函数)思想剖析
    • 函数指针做函数参数两种用法(正向调用、反向调用)
  • 纯虚函数 抽象类
    • 抽象类基本概念
    • 抽象类在多继承中的应用
    • 面向抽象类编程案例强化
    • C面向接口编程和C多态
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

//图形类
//如果说一个类 拥有一个纯虚函数
//就称这个类是一个抽象类。
//不管这个类中有没有成员属性,只要这个类有纯虚函数,就是一个抽象类, 抽象类就是不能够实例化的。
class Shape
{
public:
    //求图形面积的方法
    //表示图形类声明一个方法getArea(),它是一个纯虚函数,没有函数的实现。
    virtual double getArea() = 0;
};

//三角形
class Tri :public Shape
{
public:
    Tri(int a, int h)
    {
        this->a = a;
        this->h = h;
    }
    virtual double getArea() {
        cout << "三角形求面价" << endl;
        return 0.5*a*h;
    }

private:
    int a;
    int h;
};

//正方形:
//如果说一个普通类,继承拥有纯虚函数的类,如果说不重写纯虚函数,依然是一个抽象类。
//依然不能被实例化, 如果想实例化, 必须要重写这个父类中所有纯虚函数
class Rect : public Shape
{
public:
    Rect(int a) {
        this->a = a;
    }
    virtual double getArea() {
        cout << "正方形求面积" << endl;
        return a*a;
    }
private:
    int a;//正方形边长
};

class Circle :public Shape
{
public:
    Circle(int r)
    {
        this->r = r;
    }

    virtual double getArea()
    {
        cout << "圆形求面积" << endl;

        return 3.14*r * 4;
    }

private:
    int  r;
};

//面向抽象类写一个架构函数
void printArea(Shape *sp)
{
    sp->getArea();
}

//业务层  面向的抽象类编程
int main(void)
{
    //main 中所有使用的变量类型 都是 抽象类Shape的类型。
    Shape *sp1 = new Rect(10);
    //sp1->getArea();

    Shape *sp2 = new Circle(20);
    //sp2->getArea();

    Shape *sp3 = new Tri(10, 20);
    //sp3->getArea();

    printArea(sp1);
    printArea(sp2);
    printArea(sp3);

    return 0;
}

上一个知识的小练习

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

//大哥的虚衔
class BigBrother
{
public:
    //会打人。
    virtual void fightPeople() = 0;
};

//东方不败
class EastNeverLose :public BigBrother
{
public:
    virtual void fightPeople()  {
        cout << "使用了葵花宝典区打人" << endl;
    }
};

//无崖子
class Wuyazi :public BigBrother
{
public:
    virtual void fightPeople()  {
        cout << "使用北冥神功打人" << endl;
    }
};

//boss
int main(void)
{
    BigBrother *bigbrother = new Wuyazi;

    //大哥你给我去打人。
    bigbrother->fightPeople();

    delete bigbrother;

    return 0;
}

纯虚函数和多继承

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

//接口1
class Interface1
{
public:
    virtual void func1(int a, int b) = 0;
    virtual void func3(int a, int b) = 0;
};

//接口2
class Interface2
{
public:
    virtual void func2(int a) = 0;
};

class Child :public Interface1, public Interface2
{
public:
    virtual void func1(int a, int b)
    {
        cout << "func1" << endl;
    }
    virtual void func3(int a, int b) {
        cout << "func3" << endl;

    }

    virtual void func2(int a)
    {
        cout << "func2 " << endl;
    }
};

int main(void)
{
    Interface1 *if1 = new Child;

    if1->func1(10, 20);
    if1->func3(100, 200);

    Interface2 *if2 = new Child;

    if2->func2(10);

    return 0;
}

电脑组装--小练习

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

//--------  抽象层---------
//抽象CPU类
class CPU
{
public:
    CPU();
    virtual void caculate() = 0;
};

//抽象的card类
class Card
{
public:
    virtual void display() = 0;
};

//抽象的内存类
class Memory
{
public:
    virtual void storage() = 0;
};

//架构类
class Computer
{
public:
    Computer(CPU *cpu, Card *card, Memory *mem)
    {
        this->cpu = cpu;
        this->card = card;
        this->mem = mem;
    }

    void work()
    {
        this->cpu->caculate();
        this->card->display();
        this->mem->storage();
    }

    ~Computer() {
        if (this->cpu != NULL) {
            delete this->cpu;
        }
        if (this->card != NULL) {
            delete this->card;
        }
        if (this->mem != NULL) {
            delete this->mem;
        }
    }
private:
    CPU* cpu;
    Card*card;
    Memory *mem;
};
// --------------------------

//-----------实现层----------
//具体的IntelCPU
class IntelCPU :public CPU
{
public:
    virtual void caculate() {
        cout << "Intel CPU开始计算了" << endl;
    }
};

class IntelCard :public Card
{
public:
    virtual void display() {
        cout << "Intel Card开始显示了" << endl;

    }
};

class IntelMem :public Memory {
public:
    virtual void storage() {
        cout << "Intel mem开始存储了" << endl;

    }
};

class NvidiaCard :public Card
{
public:
    virtual void display() {
        cout << "Nvidia 显卡开始显示了" << endl;
    }
};

class KingstonMem :public Memory {
public:
    virtual void storage() {
        cout << "KingstonMem 开始存储了" << endl;
    }
};

//--------------------------

//--------业务层-------------------
int main(void)
{
    //1 组装第一台intel系列的电脑
#if 0
    CPU *intelCpu = new IntelCPU;
    Card *intelCard = new IntelCard;
    Memory *intelMem = new IntelMem;

    Computer *com1 = new Computer(intelCpu, intelCard, intelMem);

    com1->work();

    Card *nCard = new NvidiaCard;
    Memory* kMem = new KingstonMem;

    Computer *com2 = new Computer(intelCpu, nCard, kMem);

    com2->work();

    delete intelCpu;
#endif
    Computer *com1 = new Computer(new IntelCPU, new IntelCard, new IntelMem);
    com1->work();
    delete com1;

    return 0;
}

原文地址:https://www.cnblogs.com/ygjzs/p/12079568.html

时间: 2024-10-12 20:37:41

c++-纯虚函数和抽象类的相关文章

C++:纯虚函数与抽象类

5.4.3 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但是要求在派生类中根据需要对它进行定义,或仍然说明为纯虚函数. 声明纯虚函数的一般格式是: virtual 函数类型 函数名(参数表)=0: 纯虚函数的作用是:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行重新定义.纯虚函数没有函数体,它最后面“=0 ”并不表示函数的返回值是0,它只是形式上的作用,告诉编译系统这是纯虚函数.纯虚函数不具有函数的功能,不能被调用. //应用举例 #includ

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

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

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

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

纯虚函数_抽象类

解耦合 和 模块的划分 c++没有接口的概念  但可以使用纯虚函数(抽象类)实现接口的功能 纯虚函数和抽象类纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本纯虚函数为各派生类提供一个公共界面(接口的封装和设计,软件的模块功能更划分) 纯虚函数说明形式: virtual 类型 函数名(参数表)= 0: 含有纯虚函数的基类 称为抽象类. class shape { point center; public: virtual void rotate(int)=0;

C++基础(纯虚函数与抽象类)

C++基础之纯虚函数与抽象类 引言 纯虚函数在C++编程中的地位很重要,其关联到了设计模式中"接口"的概念. 语法 纯虚函数的语法: 1.  将成员函数声明为virtual 2.  后面加上 = 0 3.  该函数没有函数体 1 class <类名> 2 { 3 virtual <类型><函数名>(<参数表>) = 0; 4 - 5 }; 例如: 1 class CmdHandler 2 { 3 virtual void OnComman

c++,纯虚函数与抽象类

1.纯虚函数的定义: (1)虚函数被“初始化”为0的函数.声明纯虚函数的一般形式是virtual 函数类型 函数名(参数表列) =0;(2)纯虚函数没有函数体:(3)最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”; (4)这是一个声明语句,最后必须加分号.(5)不能在当前类中定义 普通的虚函数 class Base { public: int i; void show1(); virtual void show2() ;//普通的虚函数 } 纯虚函数:

Hello,C++(5)纯虚函数和抽象类

纯虚函数和抽象类 下面通过一个例子来说明纯虚函数的定义方法 在这个类当中,我们定义了一个普通的虚函数,并且也定义了一个纯虚函数.那么,纯虚函数是什么呢??从上面的定义可以看到,纯虚函数就是没有函数体,同时在定义的时候,其函数名后面要加上“= 0”. 纯虚函数的实现原理 本节从虚函数表的角度来说明纯虚函数的实现原理. 上面就是我们在前面课程讲到的多态的实现原理,在讲这一部分的时候,讲到了虚函数表以及虚函数表指针.如果我们定义了Shape这样的类,那么,Shape类当中,因为有虚函数和纯虚函数,所以

纯虚函数和抽象类

-------------------siwuxie095 纯虚函数 在 C++ 中,用 纯 字来修饰虚函数,即 纯虚函数 纯虚函数没有函数体,同时在定义时,函数名的后边要加 =0 看如下实例: 纯虚函数在虚函数表中的实现: 如果定义了一个 Shape 类,因为其中有虚函数和纯虚函数, 所以 Shape 类一定有一个虚函数表,当然,也就会有一个 虚函数表指针 在虚函数表中,如果是一个普通虚函数,则对应的函数指针 就是一个有意义的值,如果是一个纯虚函数,则对应的函数 指针的值就是 0 抽象类 纯虚

c++虚函数,纯虚函数,抽象类,覆盖,重载,隐藏

C++虚函数表解析(转) ——写的真不错,忍不住转了  http://blog.csdn.net/hairetz/article/details/4137000 浅谈C++多态性  http://blog.csdn.net/hackbuteer1/article/details/7475622 C++抽象类  http://www.cnblogs.com/dongsheng/p/3343939.html C++的精髓——虚函数  http://blog.chinaunix.net/uid-268