C++ 关于virtual

本文通过实例演示了C++中虚函数的概念与作用,并对比了使用与未使用virtual关键字时的行为差异,阐述了动态绑定机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ 关于virtual

virtual的意义

C++代码里经常可以看到一些基类里的一些函数被定义为virtual,它的意义是什么呢?如果一个基类里的函数被定义为虚函数,就代表这个函数,在继承的时候希望派生类对其进行重写。
在书上看到了这些知识点之后,我做了这么一个测试,如下:

#include <iostream>
using namespace std;


class MyClass
{

public:
    int b = 100;
    int get() {
        return b;
    }
};


class Aaa :public MyClass{
public:
    int a = 10;
    int get() {
        return a;
    }
};

int main(void)
{
    Aaa aaa;
    MyClass bbb;
    cout << bbb.get() << endl;
    cout << aaa.get() << endl;
    getchar();
}

运行结果是 100
10

然后如果我们给基类的get方法加上virtual修饰,如下:

class MyClass
{

public:
    int b = 100;
    virtual int get() {
        return b;
    }
};

这个时候我们会发现一个问题,加不加virtual没有什么差别。
加不加virtual有差别吗?virtual在c++里面存在的意义是什么?

动态绑定

首先这里我们做这样一个测试,关于类的一些定义和声明都不做改动,但是把main改成如下:

void test(MyClass& a) {
    cout << a.get() << endl;
}

int main(void)
{
    Aaa aaa;
    MyClass bbb;
    test(aaa);
    test(bbb);
    getchar();
}

这个时候结果是 10
100
如果这个时候我们把基类里面的virtual声明去掉,这个时候结果会变成100 100
为什么会这样呢?这里就要引出一个C++里面的概念,叫动态绑定。

当C++中的基类指针或者引用调用虚函数的时候,就会发生动态绑定,此时调用的函数取决于指针以及引用实际指向的类(基类,及其各种派生类)中定义的方法。这里如果不把函数声明成虚函数的话就不会发生动态绑定,也就是说执行的方法全部为基类定义的方法。

到这里virtual的意义,我也就有了初步的一些理解,我的C++水平有限,如果里面有什么问题的话, 欢迎每一个看到问题的人指出我的问题。

在 C++ 中,`virtual` 关键字用于实现多态性,即通过基类指针或引用访问派生类对象的成员函数。当使用 `virtual` 关键字声明基类函数时,可以在派生类中重写该函数,使得基类指针或引用在调用该函数时能够正确地调用派生类的函数。如果没有使用 `virtual` 声明基类函数,则通过基类指针或引用调用该函数时只会执行基类自己的函数,而不会调用派生类的函数。 以下是一个使用 `virtual` 实现多态性的示例: ```c++ class Shape { public: virtual void printInfo() { std::cout << "This is a shape." << std::endl; } }; class Rectangle : public Shape { public: void printInfo() override { std::cout << "This is a rectangle." << std::endl; } }; class Circle : public Shape { public: void printInfo() override { std::cout << "This is a circle." << std::endl; } }; int main() { Shape* p; Shape s; Rectangle r; Circle c; p = &s; p->printInfo(); // 输出:This is a shape. p = &r; p->printInfo(); // 输出:This is a rectangle. p = &c; p->printInfo(); // 输出:This is a circle. return 0; } ``` 在上面的示例中,我们定义了一个基类 `Shape` 和两个派生类 `Rectangle` 和 `Circle`,它们都重写了基类中的 `printInfo` 函数。在 `main` 函数中,我们使用基类指针 `p` 分别指向基类对象 `s`、派生类对象 `r` 和 `c`,通过调用 `p->printInfo()` 实现多态性,输出了不同的信息。注意,在基类中声明函数时需要使用 `virtual` 关键字,而在派生类中重写函数时需要使用 `override` 关键字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值