首页 > 编程语言 >C++ 多态 虚函数virtual

C++ 多态 虚函数virtual

时间:2023-06-04 21:11:37浏览次数:42  
标签:子类 函数 double 多态 C++ FA virtual 基类 public

先解释虚函数,对于基类,子类继承基类后可能会调用其某个函数FA,而不同的子类继承了同一个基类后需要基类内某个同样的函数FA但又不是同个作用,此时则会在对应的子类内对应重载派生出FA_B函数和FA_C函数,而这时要求FA为虚函数(virtual)

那为什么不各自写成一个函数B和C呢?这就是多态的意义

对于基类A和子类B,C有

B b;
C c;

A *ab = &b;
A *ac = &c;

则基类指针指向子类,此时调用其内函数

ab->FA;
ac->FA;

虽然是同一个类的同一个函数,但是其效果不一致,这就是多态,即规范了写法又实现灵活的功能。

 

用法:

  基类内虚函数前缀virtual,纯虚函数则以const=0结尾,必须重载功能才有具体意义;而非纯虚函数则是先定义好功能,子类可选择性进行重载。

 

完整代码参考

#include <iostream>

// 形状的基类
class Shape {
public:
    virtual double calculateArea() const = 0;
};

// 矩形类
class Rectangle : public Shape {
private:
    double length;
    double width;
public:
    Rectangle(double l, double w) : length(l), width(w) {}
    double calculateArea() const override {
        return length * width;
    }
};

// 圆类
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    double calculateArea() const override {
        return 3.14 * radius * radius;
    }
};

int main() {
    Rectangle rectangle(5, 4);
    Circle circle(3);

    Shape* shape1 = &rectangle;
    Shape* shape2 = &circle;

    // 通过基类指针调用不同对象的函数
    std::cout << "Area of rectangle: " << shape1->calculateArea() << std::endl;
    std::cout << "Area of circle: " << shape2->calculateArea() << std::endl;

    return 0;
}

 

标签:子类,函数,double,多态,C++,FA,virtual,基类,public
From: https://www.cnblogs.com/toriyung/p/17456339.html

相关文章

  • C++程序开发技巧
    引言类(class)的使用分为两种——基于对象(objectBased)和面向对象(objectoriented)基于对象是指,程序设计中单一的类,和其他类没有任何关系单一的类又分为:不带指针的类(classwithoutpointermembers)和带指针的类(classwithpointermembers)面向对象则是类(class)中涉及了类之间的关......
  • Effective Modern C++(四)再探移动语义与完美转发
    移动语义移动语义是c++11最为重要的特性之一,但这不代表着我们可以在任何时候都无脑地使用它。在以下几个情况下,移动语义并没有什么用处。没有移动操作:要移动的对象没有提供移动操作,所以移动的写法也会变成复制操作。比如对于STL库中的array容器而言,他的元素都直接存储在了......
  • QT--C++简学
    2.1C++语言的新特点(对于C语言来说) 赋值:直接------- intx(100) 在定义的时候就可以赋值,相当于x=100;2.2输入(cin)--------输出(cout)  2.2.1   cout<<x<<endl;  //一个变量             --------printf     cout<<x<......
  • Effective Modern C++(三)引用折叠
    template<typenameT>voidfunc(T&&param);对于一个通用引用,只有当实参被用来实例化通用引用形参时,才会推导形参T。编码机制是简单的。当左值实参被传入时,T被推导为左值引用。当右值被传入时,T被推导为非引用。WidgetwidgetFactory();//返回右值的函数Widgetw;......
  • C++学习资源
    项目STL网站zouxiaohang/TinySTL:TinySTLisasubsetofSTL(cutsomecontainersandalgorithms)andalsoasupersetofSTL(addsomeothercontainersandalgorithms)https://github.com/zouxiaohang/TinySTL......
  • C/C++数据结构设计题[2023-06-04]
    C/C++数据结构设计题[2023-06-04]停车场模拟管理程序的设计与实现1.设计目的理解线性表的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。2.问题描述设停车场只有一个可停放几辆汽车的狭长通道,只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺......
  • C++面试八股文:struct、class和union有哪些区别?
    某日小二参加XXX科技公司的C++工程师开发岗位5面:面试官:struct和class有什么区别?小二:在C++中,struct和class的唯一区别是默认的访问控制。struct默认的成员是public的,而class的默认成员是private的。面试官:struct、class和union有哪些区别?小二:union和struct、class在内存布局上......
  • Effective Modern C++(二)完美转发与移动语义
     移动语义使编译器有可能用廉价的移动操作来代替昂贵的拷贝操作。正如拷贝构造函数和拷贝赋值操作符给了你控制拷贝语义的权力,移动构造函数和移动赋值操作符也给了你控制移动语义的权力。移动语义也允许创建只可移动(move-only)的类型,例如std::unique_ptr,std::future和std::threa......
  • C++ chrono
    std::ratio表示一个单位时间。template<std::intmax_tNum,std::intmax_tDenom=1>classratio;Num是时间的分子,Denom是时间的分母。std::milli=std::ratio<1,1000>std::centi=std::<1,100>std::deci=std::<1,10>std::chrono::duration......
  • 多态实现计算器
    #include<iostream>usingnamespacestd;classcal{public: virtualintgetresult() { return0; } intnum1; intnum2;};classadd:publiccal{public: intgetresult() { returnnum1+num2; }};classsub:publiccal{public: intgetresult() { returnnum1-num2......