C++中的抽象类

一、概念

在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。

二、例子

class Car
{
public:
    virtual void Drive() = 0;
};
class Benz :public Car
{
public:
    virtual void Drive()
    {
        cout << "Benz-舒适" << endl;
    }
};
class BMW :public Car
{
public:
    virtual void Drive()
    {
        cout << "BMW-操控" << endl;
    }
};
void Test()
{
    Car* pBenz = new Benz;
    pBenz->Drive();
    Car* pBMW = new BMW;
    pBMW->Drive();
}

三、接口继承和实现继承

 普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现。虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数。

C++抽象类可以包含数据成员,但是通常情况下抽象类的数据成员应该被声明为 protected 或 private,以便子类可以访问但客户端不能访问。 抽象类的数据成员通常用于存储子类共有的数据,以避免子类重复定义这些数据成员。例如,如果我们有一个表示几何图形的抽象类 Shape,那么它可以包含一个 protected 的数据成员 color,以便所有子类都可以访问并存储它们的颜色信息。 以下是一个简单的例子,展示了抽象类的数据成员的使用方法: ```cpp class Shape { public: Shape(string c): color(c) {} virtual double getArea() = 0; protected: string color; }; class Circle: public Shape { public: Circle(double r, string c): Shape(c), radius(r) {} double getArea() { return 3.14 * radius * radius; } private: double radius; }; class Rectangle: public Shape { public: Rectangle(double w, double h, string c): Shape(c), width(w), height(h) {} double getArea() { return width * height; } private: double width; double height; }; int main() { Shape* s1 = new Circle(2.0, "red"); Shape* s2 = new Rectangle(2.0, 3.0, "blue"); cout << "Circle area: " << s1->getArea() << ", color: " << s1->color << endl; cout << "Rectangle area: " << s2->getArea() << ", color: " << s2->color << endl; delete s1; delete s2; return 0; } ``` 在上面的例子,我们在抽象类 Shape 添加了一个 protected 的数据成员 color,以便所有子类都可以访问它。然后我们在子类 Circle 和 Rectangle 分别定义了它们自己的数据成员,但没有重复定义 color。最后我们在主函数创建了 Circle 和 Rectangle 的实例,并输出它们的面积和颜色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值