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
    评论
C++中,delete是用于释放在堆上动态分配的内存,并调用相应对象的析构函数的运算。delete操作会根据所删除对象的类型找到正确的析构函数并进行调用。 可以通过在基类的析构函数前加上virtual关键字来实现多态性,使得delete操作能够正确调用派生类的析构函数。这样,在删除指向基类指针的对象时,会自动调用派生类的析构函数。 如果在基类的析构函数中不加上virtual关键字,那么delete操作只会调用基类的析构函数,而不会调用派生类的析构函数。这可能导致派生类中的资源无法正确释放,造成内存泄漏。 因此,在设计继承关系的类时,如果有可能会通过基类指针删除派生类对象,就应该在基类的析构函数前加上virtual关键字,以确保delete操作能够正确调用派生类的析构函数。这是一种良好的编程实践。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++析构函数和delete关系](https://blog.csdn.net/Taynpg/article/details/109245219)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [6.4虚析构函数和纯虚析构函数](https://blog.csdn.net/qq_52563729/article/details/117041875)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值