C++命名空间及类的多态与(纯)虚函数,静态链接/动态链接

本文介绍了C++中的命名空间,通过类比解释了其作用,并深入探讨了类的多态和虚函数的概念。在没有使用虚函数的情况下,基类指针调用子类成员时,会执行基类的函数,这种情况称为早绑定或静态链接。而使用虚函数时,调用的是实际对象所属的函数,实现后期绑定或晚链接。同时提到了纯虚函数的应用,用于定义不能在基类中具体实现的函数。

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

一、 命名空间
1. 形象表示:有两个人名字相同,但是属于不同的公司,如何辨别?这就需要声明是哪个公司的人了。
关键词: namespace
案列:

#include "stdio.h"
#include "iostream"
using namespace std;

namespace A
{
    int a;
    int b;
    void fun(int a, int b) {
        int c=a < b ? a : b;
        cout << c << endl;
        }
}

namespace B
{
    int a;
    int b;
    void fun(int a, int b) {
    int c=a > b ? a : b;
    cout << c << endl;
    }

}

int main() {
    using namespace A;
    cout << "please input 2 numbers:" << endl;
    int a, b;
    cin >> a;
    cin >> b;
    fun(a, b);
    B::fun(a, b);//B空间
    A::fun(a, b);//A空间
    return 0;
}

二、类的多态与虚函数
这里当类的多态发生在基类派生或者子类继承情况下,如果基类不是用虚函数的话,则基类指针指向子类的成员函数或者变量的时候,输出仍然是基类的情况。具体实例如下:


/*类的多态与虚函数,早绑定/静态链接与后期绑定/动态链接*/

#include "stdio.h"
#include "iostream"
using namespace std;

//定义基类student
class student
{
public:
    student();
    ~student();
//这里如果不用虚函数,则为静态链接。
//  int score()
    virtual int score()
    {
        cout << "the score of this student is:" << endl;
        return 0;
}
private:

};

//定义子类,goodstu和bedstu,公有继承基类student
class goodstu :public student {
//重新定义基类函数score
    int score()
    {
        cout << "the score of good is:" << endl;
        return 0;
    }

};

class bedstu : public student {
//重新定义基类函数score
    int score()
    {
        cout << "the score of bed is:" << endl;
        return 0;
    }

};

//主函数
int main() {
//定义基类student类型的指针p
//定义子类goodstu类型的xiaoming,bedstu类型的xiaohu
    student *p;
    goodstu xiaoming;
    bedstu  xiaohu;

//父类指针指向子类xiaoming
    p = &xiaoming;
    p->score();

//父类指针指向子类xiaohu
    p = &xiaohu;
    p->score();

    return 0;
}


//构造函数和析构函数的定义

student::student()
{
}

student::~student()
{
}

如果基类不是virtural int student(){},则即使子类用

p = &xiaoming;
xiaoming->score();

p = &xiaohu;
xiaohu->score();

编译的结果仍然是父类的函数score的输出情况,即
the score of this student is:

但是,如果基类采用的是virtual int student(),则子类的输出为:
the score of goodstu is:
the score of bedstu is:
由此可见虚函数的作用,第一种情况没有用虚函数,即使指向的是子类,但是输出的也是父类情况。所以称之为早绑定/静态链接,后面的那种情况则称之为后期绑定/晚链接。

这里简要叙述一下纯虚函数,如果我们在基类中无法给出该函数的准确定义,而在基类中重新给出定义,则可以采用纯虚函数,命名规则为:

virtual int student()=0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值