virtual 函数指定符

virtual 函数指定符

< cpp‎ | language

virtual 指定符指定非静态成员函数为并支持动态绑定。它只能出现在非静态成员函数首个声明(即它声明于类定义中时)的 decl-specifier-seq 中。

解释

虚函数是在派生类中行为可被覆写的成员函数。与非虚函数相反,覆写的行为会受到保留,即使没有关于该类实际类型的编译时信息。若使用到基类的指针或引用处理派生类,则对被覆写虚函数的调用,将会调用定义于派生类的行为。若使用有限定名称查找(即若函数名出现在作用域解决运算符 :: 的右侧),则此行为被压制。

#include <iostream>
struct Base {
   virtual void f() {
       std::cout << "base\n";
   }
};
struct Derived : Base {
    void f() override { // 'override' 可选
        std::cout << "derived\n";
    }
};
int main()
{
    Base b;
    Derived d;
 
    // 通过引用调用虚函数
    Base& br = b; // br 的类型是 Base&
    Base& dr = d; // dr 的类型也是 Base&
    br.f(); // 打印 "base"
    dr.f(); // 打印 "derived"
 
    // 通过指针调用虚函数
    Base* bp = &b; // bp 的类型是 Base*
    Base* dp = &d; // dp 的类型也是 Base*
    bp->f(); // 打印 "base"
    dp->f(); // 打印 "derived"
 
    // 非虚函数调用
    br.Base::f(); // 打印 "base"
    dr.Base::f(); // 打印 "base"
}

细节

consteval 虚函数不能覆写非 consteval 虚函数或被它覆写。

若某成员函数 vf 在类 Base 中声明为 virtual ,且某个直接或间接从 Base 派生的类 Derived 拥有下列几点与之相同的成员函数声明

  • 名称
  • 参数列表(但非返回类型)
  • cv 限定符
  • 引用限定符

则类 Derived 中的此函数亦为(无论是否于其声明使用关键词 virtual )并覆写 Base::vf (无论是否于其声明使用词 override )。

要覆写的 Base::vf 不需要可见(可声明为 private ,或用私有继承继承)。

class B {
    virtual void do_f(); // 私有成员
 public:
    void f() { do_f(); } // 公开继承
};
struct D : public B {
    void do_f() override; // 覆写 B::do_f
};
 
int main()
{
    D d;
    B* bp = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值