C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++接口继承与实现继承

C++中实现接口继承与实现继承的方法及它们的区别

作者:夕泠爱吃糖

在 C++ 中,接口继承和实现继承是两种不同的继承方式,它们在设计模式、代码复用和多态性方面有着不同的应用,下面将分别解释这两者的概念、实现方式及其区别,感兴趣的朋友一起看看吧

概念

在 C++ 中,接口继承和实现继承是两种不同的继承方式,它们在设计模式、代码复用和多态性方面有着不同的应用。下面将分别解释这两者的概念、实现方式及其区别。

接口继承

接口继承指的是只继承类的接口(即公共的成员函数声明)而不实现这些函数。通常通过纯虚函数来实现。这样做的目的是约定一个行为规范,而具体的实现则留给派生类去完成。
示例:

#include <iostream>  
// 定义一个接口  
class Drawable {  
public:  
    virtual void draw() const = 0; // 纯虚函数  
    virtual ~Drawable() {}          // 虚析构函数以保证正确的析构  
};  
class Circle : public Drawable {  
public:  
    void draw() const override {  
        std::cout << "Drawing a circle." << std::endl;  
    }  
};  
class Square : public Drawable {  
public:  
    void draw() const override {  
        std::cout << "Drawing a square." << std::endl;  
    }  
};  
void render(const Drawable& shape) {  
    shape.draw(); // 调用接口的实现  
}  
int main() {  
    Circle circle;  
    Square square;  
    render(circle); // 输出: Drawing a circle.  
    render(square); // 输出: Drawing a square.  
    return 0;  
}

输出

Drawing a circle.  
Drawing a square.

代码解析

接口定义

class Drawable {  
public:  
    virtual void draw() const = 0; // 纯虚函数  
    virtual ~Drawable() {}          // 虚析构函数以保证正确的析构  
};
class Circle : public Drawable {  
public:  
    void draw() const override {  
        std::cout << "Drawing a circle." << std::endl;  
    }  
};
class Square : public Drawable {  
public:  
    void draw() const override {  
        std::cout << "Drawing a square." << std::endl;  
    }  
};
void render(const Drawable& shape) {  
    shape.draw(); // 调用接口的实现  
}
int main() {  
    Circle circle;  
    Square square;  
    render(circle); // 输出: Drawing a circle.  
    render(square); // 输出: Drawing a square.  
    return 0;  
}

关键点

总结

实现继承

实现继承指的是继承一个类的完整实现,而不仅仅是接口。这意味着子类不仅可以使用父类的方法和属性,还可以访问和重用父类的实现。这种方式通常在需要共享代码的场景中使用。

示例:

#include <iostream>  
// 基类  
class Shape {  
public:  
    void setPosition(int x, int y) {  
        m_x = x;  
        m_y = y;  
    }  
protected:  
    int m_x, m_y; // 保护的成员变量  
};  
class Circle : public Shape {  
public:  
    void draw() {  
        std::cout << "Drawing a circle at (" << m_x << ", " << m_y << ")." << std::endl;  
    }  
};  
class Square : public Shape {  
public:  
    void draw() {  
        std::cout << "Drawing a square at (" << m_x << ", " << m_y << ")." << std::endl;  
    }  
};  
int main() {  
    Circle circle;  
    circle.setPosition(10, 20);  
    circle.draw(); // 输出: Drawing a circle at (10, 20).  
    Square square;  
    square.setPosition(30, 40);  
    square.draw(); // 输出: Drawing a square at (30, 40).  
    return 0;  
}

输出

Drawing a circle at (10, 20).  
Drawing a square at (30, 40).

代码解析

基类定义

class Shape {  
public:  
    void setPosition(int x, int y) {  
        m_x = x;  
        m_y = y;  
    }  
protected:  
    int m_x, m_y; // 保护的成员变量  
};
class Circle : public Shape {  
public:  
    void draw() {  
        std::cout << "Drawing a circle at (" << m_x << ", " << m_y << ")." << std::endl;  
    }  
};
class Square : public Shape {  
public:  
    void draw() {  
        std::cout << "Drawing a square at (" << m_x << ", " << m_y << ")." << std::endl;  
    }  
};
int main() {  
    Circle circle;  
    circle.setPosition(10, 20);  
    circle.draw(); // 输出: Drawing a circle at (10, 20).  
    Square square;  
    square.setPosition(30, 40);  
    square.draw(); // 输出: Drawing a square at (30, 40).  
    return 0;  
}

关键点

总结

区别

到此这篇关于C++中如何实现接口继承与实现继承,以及它们的区别?的文章就介绍到这了,更多相关C++接口继承与实现继承内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文