笔记2

函数重载:

同一类中,函数参数不同(类型,顺序不同),返回值可同可不同,virtual关键字可有可无。

void Func(int x,int y);
void Func(double x,double y);

该函数被c编译器编译后库中名字为_Func,c++编译器编译后 产生
_Func_int_int,_Func_double_double标识符,以便程序调用相应函数。

如果C++程序要调用已经被编译后的C函数,该怎么办?
解答:假设某个C函数的声明如下:

void foo(int x, int y);

该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int
之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。C++提供了一个C连接交换指定符号extern“C”来解决这个问题。
例如:

extern “C”
{
    void foo(int x, int y);
    …// 其它函数
}

这就告诉C++编译译器,函数foo 是个C连接,应该到库中找名字_foo而不是找
_foo_int_int。C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。

覆盖

(派生类函数覆盖基类函数):

1. 不同范围(分别位于派生类与基类函数);
2. 函数名字相同
3. 参数相同
4. 基类函数必须有virtual关键字
class Base

{

public:

   void f(int x){ cout << "Base::f(int) " << x << endl; }

   void f(float x){ cout << "Base::f(float) " << x << endl; }

   virtual void g(void){ cout << "Base::g(void)" << endl; }

};



class Derived : public Base

{

public:

   virtual void g(void){ cout << "Derived::g(void)" << endl; }

};



void Test()

{

   Derived d;

   Base *pb = &d;

   pb->f(42);   // Base::f(int) 42

   pb->f(3.14f);  // Base::f(float) 3.14

   pb->g();  // Derived::g(void)

}

隐藏

(派生类屏蔽了与其同名的基类函数):

1. 若派生类函数​与基类函数同名,参数不同,无论有无virtual关键字,基类函数被隐藏。
2. 若派生类函数与基类函数同名,参数相同,基类函数无virtual关键字,基类函数被隐藏。

class Base

{

public:

   virtual void f(float x){ cout << "Base::f(float) " << x << endl; }

   void g(float x){ cout << "Base::g(float) " << x << endl; }

   void h(float x){ cout << "Base::h(float) " << x << endl; }

};



class Derived : public Base

{

public:

   virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }

   void g(int x){ cout << "Derived::g(int) " << x << endl; }

   void h(float x){ cout << "Derived::h(float) " << x << endl; }

};

//(1)函数Derived::f(float)覆盖了Base::f(float)。

//(2)函数Derived::g(int)隐藏了Base::g(float),而不是重载。

//(3)函数Derived::h(float)隐藏了Base::h(float),而不是覆盖。


void Test()

{

   Derived d;

   Base *pb = &d;

   Derived *pd = &d;

   // Good : behavior depends solely on type of the object

   pb->f(3.14f);  // Derived::f(float) 3.14

   pd->f(3.14f); // Derived::f(float) 3.14

   // Bad : behavior depends on type of the pointer

   pb->g(3.14f);  // Base::g(float) 3.14

   pd->g(3.14f);  // Derived::g(int) 3 (surprise!)

   // Bad : behavior depends on type of the pointer

   pb->h(3.14f);  // Base::h(float) 3.14 (surprise!)

   pd->h(3.14f);  // Derived::h(float) 3.14

}

注意:
1. 基类的构造函数,析构函数,赋值函数不能被派生类继承。
2. 派生类的构造函数应在初始化列表内调用基类的构造函数;
3. 基类与派生类的析构函数加vitrual关键字
4. 在编写派生类赋值函数时,不要忘记对基类的数据成员重新赋值

继承

(提高程序的复用性):
若A是基类,B是派生类,则B继承A的数据与函数。



class A
{
public:
   void Func1(void);
   void Func2(void);
};
class B :public A
{
public:
   void Func3(void);
   void Func4(void);

};

void Test()
{
   B b;
   b.Func1();//继承
   b.Func2();//继承
   b.Func3();
   b.Func4();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值