关注
当我们使用基类的引用或指针调用一个虚成员函数时会发生动态绑定,知道运行时才会知道到底调用了哪个版本的虚函数,因此所有的虚函数都必须有定义。 对虚函数的调用可能在运行时才被解析 面向对象编程的核心思想是多态性(polymorphism)。多态性这个词源于希腊语,其含义是“多种形态”,引用或指针的静态类型与动态类型不同这一事实是C++语言支持多态性的根本所在。 当使用基类的引用或指针调用基类中定义的一个函数时,我们并不知道该函数真正作用的对象是什么类型的(可能是基类的对象也可能是派生类的对象)。如果该函数是虚函数,则直到运行时才会确定是哪个版本,判断的依据是引用或指针所绑定的对象的真实类型。 另一方面,非虚函数的调用在编译时进行绑定。类似的,通过对象进行绑定的函数(虚函数或非虚函数)调用也在编译时进行绑定,因为对象的类型是不会改变的。 派生类中的虚函数: 在派生类中覆盖某个虚函数时,可以加上virtual关键字,但是没有必要,因为一个函数被声明为虚函数后,所有派生类中的它都是虚函数,且它的形参类型与返回值类型(一个例外是返回类型是类本身的指针或引用)都和基类中相同。 final和override说明符: 派生类如果定义了一个和基类中的虚函数名字相同但是此参数列表不同的函数时,这依然是合法的行为,但是并不是我们希望的情况。在C++11新标准中可以使用override来说明基类中的虚函数,这么做的好处是使得程序员的意图更清晰的同时让编译器可以发现这一错误:当使用override标记了某个函数,但该函数并没有覆盖已存在的虚函数,编译器将报错。 struct A{
virtual void f1(int) const;
virtual void f2();
void f3();
};
struct B : A {
void f1(int) const override; //正确
void f2(int) override; //错误,参数列表不匹配
void f3() override; //错误,f3不是虚函数
void f4() override; //错误,A中没有f4()
}; 虚函数与默认实参: 和其它函数一样,虚函数也可以拥有默认实参,如果某此函数调用使用了默认实参,则该实参值由本次调用的静态类型决定。也就是说当使用基类的引用或指针调用函数时会使用基类中定义的的默认实参,即使实际上运行的是派生类中的函数版本也是如此,因此虚函数如果使用默认实参,则基类和派生类中定义的默认实参最好是一致的。
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
转发
投递网易有道等公司10个岗位 > 软件开发薪资爆料
点赞 评论 收藏
转发
牛客热帖
正在热议
# 牛客帮帮团来啦!有问必答 #
351426次浏览 7281人参与
# 你更愿意参加线上面试还是线下面试? #
4710次浏览 73人参与
# 晒一晒我的offer #
2765280次浏览 49493人参与
# 如何确定求职岗位 #
100909次浏览 2395人参与
# 华为求职进展汇总 #
433379次浏览 4353人参与
# 机械人怎么评价今年的华为 #
49297次浏览 404人参与
# 非技术岗薪资爆料 #
4990次浏览 114人参与
# 第一次面试 #
13824次浏览 212人参与
# 如果再来一次,你还会学硬件吗 #
16778次浏览 330人参与
# 海信求职进展汇总 #
6783次浏览 91人参与
# 通信硬件薪资爆料 #
137238次浏览 977人参与
# 来聊聊机械薪资天花板是哪家 #
18264次浏览 138人参与
# 找工作,你会甘心进小厂还是猛冲大厂 #
22064次浏览 212人参与
# 除了offer,现在你还缺点啥? #
2037次浏览 45人参与
# 应届生应该先就业还是先择业 #
10721次浏览 103人参与
# 通信硬件人笔面经互助 #
63488次浏览 1414人参与
# 百度工作体验 #
18989次浏览 205人参与
# 讲讲我经历过的年终奖 #
5805次浏览 76人参与
# 租房前辈的忠告 #
19755次浏览 1579人参与
# 软件开发薪资爆料 #
535726次浏览 9212人参与