c++ 的虚函数与多态性

本贴最后更新于 2804 天前,其中的信息可能已经天翻地覆

C++ 多态性

oop 的核心思想是多态性,多态性代表多种形式
我们把具体有继承关系的多个类型称为多态性,因为我们能使用这些类型的多态性而无需在意他们的差异

引用和指针的静态类型和动态类型的不同正是 C++ 语言支持多态性的根本所在

只有当通过函数指针的或者引用调用函数时,才会在运行时候解析该运用,也只有在这种情况下,动态类型和静态类型才会不相同

静态类系和动态类型

  • 静态类型和动态类型的区别是,静态类型是在编译的时候是已知的,他是变量声明时的类型或表达式生成的类型;
    动态类型是变量或者表达式表示的内存中的对象类型,动态类型直到运行的时候才知道。

  • 只有指针和引用调用虚函数的时候,才会根据这个引用和指针绑定的不同对象来调用不用的虚函数
    那么问题来了什么样的函数称为虚函数呢?
    在 C++ 语言中,在基类的函数声明上添加 virtual 声明符就可以定义一个虚函数

在 C++ 中,基类希望它的派生类都各自定义适合自身的版本的函数的话,就应该将这个函数声明称为虚函数

派生类对象及派生类向基类类型的转换

假如说,我们定义了一个基类的名字叫人 ,他的派生类的名字叫男人和女人
男人照镜子非常快,但是女人就不一样了,所以这里就体现了多态性

class man { public: man()=default; virtual ~man(); virtual void lookatmirror() { /* */ } }; class boy : public man { public: boy() = default; virtual ~boy(); virtual void lookamirror()override { //very fast; } }; class girl : public man { public: girl() = default; virtual ~girl(); virtual void lookmirror() override{ sleep(10000); //看个10000秒 } }; 比如说我们现在创建了一个指向基类的指针, man * goodman = new man; boy herb(); goodman = & herb; //动态绑定,虽然goodman 的类型是 指向基类的指针,但是这里绑定了一个动态类型; goodman->lookatmirror();//执行的是boy的 虚函数; 如果这里绑定的类型是另外一个基类,那么就会执行另外一个派生类的函数。

我们对象在内存中的可以理解成两个部分,一部分是从基类继承而来的,一部分派生类自己定义的,
一个派生类可以在需要的时候转换称为基类,转换的同时就会把属于自己那部分给切掉
而基类不能转换称为一个派生类


double printtotle(std::ostream & os, const Quote & item, std::size_t t) { double ret = item.net_price(t); os << "ISBN: " <<item.isbn()<<" number: " <<t << " total due:" << ret << std::endl; return ret; }

定义一个基类

class Quote { friend double print_totle(std::ostream& os, const Quote &item, std::size_t t); public : Quote() = default; Quote(const std::string &book, double sales_price):bookNo(book),price(sales_price){} std::string isbn() const { return bookNo; } Quote& operator=(const Quote&rhs); //return sales_data virtual double net_price(std::size_t n) const //虚函数 { return n*price; } virtual void debug() const; virtual ~Quote() = default; //基类通常都需要定义一个析构函数,即使该函数不执行任何实际操作也是如此 private: std::string bookNo; protected: double price = 0.0; };
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...