【C/C++】【类和对象】派生类和函数遮蔽

派生类概念

类之间有层次关系;
父类(基类、超类);子类(派生类);
父类中定义一些公用的成员变量和成员函数;通过继承父类来构建子类;

class 子类名:继承方式:父类

派生类对象定义时调用构造函数的顺序

当定义子类对象时候,父类和子类的构造函数都会被调用,而且,父类的构造函数的函数体先执行,子类的构造函数的函数体后执行;

#include <iostream>
using namespace std;

class Human
{
public:
    Human();
    Human(int);

private:
    int m_Age;
    char m_Name[100];
};

Human::Human()
{
    cout << "Human::Human()" << endl;
}

Human::Human(int tmp)
{
    cout << "Human::Human(int tmp)" << endl;
}

//Men是Human的子类
class Men:public Human
{
public:
    Men();
    Men(int);

private:
};

Men::Men()
{
    cout << "Men::Men()" << endl;
}

Men::Men(int tmp)
{
    cout << "Men::Men(int tmp)" << endl;
}

int main()
{
    Men men;
    /*
    Human::Human()
    Men::Men()
    */
}

public/protected/private

三种访问权限

  • public:可以被任意实体所访问;
  • protected:只允许本类或者子类的成员函数来访问;
  • private:只允许本类的成员函数访问;

三种继承方式

  • public

  • protected

  • private

    基类中访问权限 子类继承基类的继承方式 子类得到的访问权限
    public public public
    protected public protected
    private public 子类无权访问
    public protected protected
    protected protected protected
    private protected 子类无权访问
    public private private
    protected private private
    private private 子类无权访问

总结:

  • 子类public继承父类不改变父类的访问权限
  • protected继承将父类中public成员成为子类的protected成员
  • private继承将父类中所有成员成为子类的private成员
  • 父类中的private成员不受继承方式的影响,子类永远无权访问;
  • 对于父类来说,尤其是父类的成员函数,如果不想让外界访问,就设置为private;如果想让自己的子类能够访问,就设置成protected;如果想公开,就设置成public;

函数遮蔽

  • 父类中有两个同名函数func,带参数的和不带参数的;也就是函数重载;
  • 子类中又重新定义了带参数的func;会导致子类无法调用父类中的无参的func;
  • 子类如果有一个同名函数,那么父类中,无论有几个同名函数,子类都无法访问到;
/*函数遮蔽演示*/
#include <iostream>
using namespace std;

class Human
{
public:
    Human();
    Human(int);

private:
    int m_Age;
    char m_Name[100];
public:
    void func();
    void func(int tmp);
};

Human::Human()
{
    cout << "Human::Human()" << endl;
}

Human::Human(int tmp)
{
    cout << "Human::Human(int tmp)" << endl;
}


void Human::func()
{
    cout << "void Human::func()" << endl;
}

void Human::func(int tmp)
{
    cout << "void Human::func(tmp)" << endl;
}

//Men是Human的子类
class Men:public Human
{
public:
    Men();
    Men(int);

private:

public:
    void func(int tmp);
};

Men::Men()
{
    cout << "Men::Men()" << endl;
}

Men::Men(int tmp)
{
    cout << "Men::Men(int tmp)" << endl;
}

void Men::func(int tmp)
{
    cout << "void Men::func(tmp)" << endl;
}

int main()
{
    Men men;
    men.func(1);
}

函数遮蔽解决
如果想调用父类中的同名函数?

  1. 在子类的成员函数中,同名函数中调用:Men::func();
  2. using:C++11引入的,可以让父类同名函数在子类中可见;通过使用using可以让父类同名函数在子类中可见,就是让父类同名函数在子类中以重载的方式来使用;
/*函数遮蔽解决*/
#include <iostream>
using namespace std;
class Human
{
public:
    Human();
    Human(int);

private:
    int m_Age;
    char m_Name[100];
public:
    void func();
    void func(int tmp);
};

Human::Human()
{
    cout << "Human::Human()" << endl;
}


Human::Human(int tmp)
{
    cout << "Human::Human(int tmp)" << endl;
}

void Human::func()
{
    cout << "void Human::func()" << endl;
}

void Human::func(int tmp)
{
    cout << "void Human::func(tmp)" << endl;
}
//Men是Human的子类
class Men:public Human
{
public:
    Men();
    Men(int);

private:

public:
    void func(int tmp);
    using Human::func; //解决函数遮蔽问题;
};

Men::Men()
{
    cout << "Men::Men()" << endl;
}


Men::Men(int tmp)
{
    cout << "Men::Men(int tmp)" << endl;
}

void Men::func(int tmp)
{
    cout << "void Men::func(tmp)" << endl;
}

int main()
{

    Men men;
    men.func(1);
    men.func();

}

原文链接: https://www.cnblogs.com/NaughtyCoder/p/13328197.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    【C/C++】【类和对象】派生类和函数遮蔽

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/367382

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午5:45
下一篇 2023年3月2日 下午5:45

相关推荐