程序基石系列之重载, 覆盖和隐藏

刚从网上看点C++东东写的不错。在此,结合自己所理解地,整理整理C++中重载(overload), 覆盖(override)和隐藏概念。
  • 重载(overload)指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断
    • 其特征为:
      • 相同的范围(在同一个作用域中) ;
      • 函数名字相同;
      • 参数不同;
      • virtual 关键字可有可无。
      • 返回值可以不同;
  • 重写(也称为覆盖 override)是指派生类重新定义基类的虚函数
    • 特征是:
      • 不在同一个作用域(分别位于派生类与基类) ;
      • 函数名字相同;
      • 参数相同;
      • 基类函数必须有 virtual 关键字,不能有 static 。
      • 返回值相同(或是协变),否则报错;
      • 重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的。
  • 重定义(也成隐藏)
    • 特征是:
      • 不在同一个作用域(分别位于派生类与基类) ;
      • 函数名字相同;
      • 返回值可以不同;
      • 参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意与重载以及覆盖混淆) 。
      • 参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意与覆盖混淆) 。

给参考代码,便于理解

// Eclipse CDT and G++

#include <iostream>
#include <complex>
using namespace std;

class Base
{
public:
    virtual void f(int){
    	cout<<"Base::f(int)"<<endl;
    }
    virtual void f(double){
    	cout<<"Base::f(double)"<<endl;
    }
    virtual void g(int){
    	cout<<"Base::g(int)"<<endl;
    }
    void h(int x){
    	cout<<"Base::h(int)"<<endl;
    }
};
class Derived : public Base
{
public:
    // redefine the Base::f() function
    void f(complex<double>){
    	cout << "Derived::f(complex<double>)" << endl;
    }
    // override the Base::g(int) function
    void g(int x){
    	cout << "Derived::g(int)" << endl;
    }
    // redefine the Base::h() function
    void h(int){
    	cout << "Derived::h(int)" << endl;
    }
};

int main()
{
    Base base;
    Derived derived;
    Base* pb = new Derived;

    base.f(1.0);  // Base::f(double)
    derived.f(1.0);  // Derived::f(complex)
    pb->f(1.0);  // Base::f(double), This is redefine the Base::f() function

    base.g(10);   // Base::g(int)
    derived.g(10);  // Derived::g(int)
    pb->g(10);    // Derived::g(int), This is the virtual function

    delete pb;
    return 0;
}
输出结果:

Base::f(double)
Derived::f(complex<double>)
Base::f(double)
Base::g(int)
Derived::g(int)
Derived::g(int)

通过上述的代码和输出结果,不难可以看出,

  • 第一、Base类中的第二个函数f是对第一个的重载;
  • 第二、Derived类中的函数g是对Base类中函数g的重写,即使用了虚函数特性。
  • 第三、Derived类中的函数f是对Base泪中函数f的隐藏,即重定义了。
  • 第四、pb指针是一个指向Base类型的指针,但是实际指向了一个Derived的空间,这里对pd调用函数的处理(多态性)取决于是否重写(虚函数特性)了函数,若没有,则依然调用基类。
  • 第五、只有在通过基类指针或基类引用 间接指向派生类类型时多态性才会起作用。因Base类的函数h没有定义为virtual虚函数,所以Derived类的函数h是对Base::h()的重定义。


关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Base是作为NoSQL数据库的基石之一的一种数据存储架构。它是一个基于列(column)而非行(row)的数据库管理系统,旨在提供高可用性、可伸缩性和弹性的数据存储方案。 Base的含义可以从以下几个方面描述。首先,Base采用列族(column family)的概念来组织和存储数据。列族是包含相关列的组合,它们在数据库中以共享的名称标识。相比传统关系型数据库中的表,列族更适合处理海量数据和高并发访问,因为他们允许对列的增删改查操作进行更高效的存储和访问。 其次,Base支持水平扩展。这意味着可以在集群中添加更多的服务器节点来存储和处理更大规模的数据。Base使用分布式架构来管理数据的副本和分片,使得系统能够自动地对数据进行负载均衡和容错处理,提高了系统的可用性和可靠性。 另外,Base还提供了弹性的数据模型。它不需要预先定义固定的数据结构,可以根据需要动态地添加、修改或删除列族和列。这种灵活性使得Base更适合应对数据模式多变的场景,尤其是在大数据和实时分析领域。 总之,Base作为NoSQL数据库的基石,通过列族存储、水平扩展和弹性数据模型等特点,提供了高性能、高可用性和高可伸缩性的数据存储方案。它可以满足现代大规模数据处理的需求,成为许多互联网公司和企业的首选数据库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值