C++纯虚函数、抽象类、纯抽象类

 

复制代码
#include<iostream>

class Shape {  //抽象类
    //包含纯虚函数的类叫抽象类
    //不能使用抽象类创建对象
    //如果类中所有的成员函数都是纯虚函数,那么该类就是纯抽象类--也叫接口类--纯属给子类做接口的类

public:
    Shape(int x = 0, int y = 0) :m_x(x), m_y(y) {    }
    virtual void draw(void) = 0;   //纯虚函数
    //自定义了接口,没有实现体的虚函数叫纯虚函数
    
protected:
    int m_x; 
    int m_y; 
};
class Rect :public Shape {  
public:
    Rect(int x, int y, int w, int h) :Shape(x, y), m_w(w), m_h(h) {}
    void draw(void) {  
        std::cout << "绘制矩形:" << m_x << ", " << m_y << ", " << m_w << ", " << m_h << std::endl;
    }
private:
    int m_w;
    int m_h;
};

class Circle :public Shape {  
public:
    Circle(int x, int y, int r) :Shape(x, y), m_r(r) {}
    void draw(void) {  
        std::cout << "绘制圆形:" << m_x << ", " << m_y << ", " << m_r << std::endl;
    }
private:
    int m_r;
};

void render(Shape* buf[]) {
    for (int i = 0; buf[i] != NULL; ++i) {
        buf[i]->draw();
        
    }
}

int main()
{
    Shape* buf[1024] = { NULL };  
    buf[0] = new Rect(100, 100, 200, 300);
    buf[1] = new Circle(100, 100, 50);
    buf[2] = new Rect(10, 80, 300, 30);
    buf[3] = new Circle(10, 150, 500);
    render(buf);

    return 0;
}
复制代码

 

工厂模式

 

复制代码
#include<iostream>

class PDF {
public:
    void parse(const char* pdffile) {  //利用this指针实现多态的函数
        std::cout << "解析出一行文本" << std::endl;
        onText();
        std::cout << "解析出一副图片" << std::endl;
        onImage();
        std::cout << "解析出一个矩形" << std::endl;
        onRect();

    }

private:
    virtual void onText(void) = 0;
    virtual void onImage(void) = 0;
    virtual void onRect(void) = 0;

};

class PDFRen :public PDF {
private:
    void onText(void) {
        std::cout << "显示一行文本" << std::endl;
    }
    void onImage(void) {
        std::cout << "绘制一副图片" << std::endl;
    }
    void onRect(void) {
        std::cout << "绘制一个矩形" << std::endl;
    }
};

int main()
{
    PDFRen r;
    r.parse("xx.pdf");

    return 0;
}
复制代码

 

 

 

 

posted @   天子骄龙  阅读(300)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2019-09-02 C++--- Lambda匿名函数表达式
2019-09-02 qt5--数据类型转换
点击右上角即可分享
微信分享提示

目录导航