【c++】访问控制、覆盖方法和重载方法

一、访问控制

访问级别

级别允许谁来访问
public任何代码
protected这个类本身和它的子类
private只有这个类本身


关于从基类继承来的方法和属性的保护

    class pig :public Animal{…}

C++不仅允许你对在类里定义的方法和属性实施访问控制,还允许你控制子类可以访问基类里的那些方法和属性

public:

告诉编译器,继承的方法和属性的访问级别不发生任何改变-即public仍然能被任何代码访问,protected只能由基类本身及其子类访问,private只能由基类本身访问。

protectd:

把基类的访问级别改为protected,如果原来是public的话,这将使得这个子类外部的代码无法通过子类去访问基类中的public。

private:

是在告诉编译器,从基类继承过来的没一个成员都当成private来对待,这意味着只有这个子类可以使用它从基类继承过来的元素(那么基类本身呢?不太懂)



二、覆盖方法

//我们声明Animal这个类,子类Pig和Bird都继承自Animal类,
//猪和鸟动的方式自然不同,所以要对父类方法进行覆盖
//首先在子类中将要覆盖的方法再声明一次,再实现一次,这就是方法覆盖。

#include<iostream>

class Animal
{
public:
        void move();
};

class Pig : Animal
{
public:
        void move();//覆盖,参数类型个数及返回值必须完全一样
};

class Bird : Animal
{
public:
        void move();
};

void Animal :: move()
{
    std::cout << "我会动哦\n";
}

void Pig :: move()
{
        std::cout << "我会跑哟\n";
}

void Bird :: move()
{
    std::cout << "我会飞呢\n";
}
 int main()
{
    Animal animal;//不能用类名直接调用函数,要先定义一个对象。
    Bird bird;
    Pig pig;

    animal.move();
    bird.move();
    pig.move();

    return 0;
 }


三、重载方法

#include<iostream>

class Animal
{
public:
          void move();
          void move(int movCount);//重载,移动距离,参数类型或者个数必须不一致
};
void Animal :: move()
{
          std::cout << "我会动哦\n";
}

void Animal :: move(int movCount)
{
          std::cout << "我移动了"<< movCount <<"这么远哦\n";
}

class Pig : Animal
{
public:
        void move();
};

class Bird : Animal
{
public:
        void move();
};

void Pig :: move()
{
        std::cout << "我会跑哟\n";
}

void Bird :: move()
{
    std::cout << "我会飞呢\n";
}
 int main()
{
    Animal animal;//不能用类名直接调用函数,要先定义一个对象。
    Bird bird;
    Pig pig;

    animal.move();
    animal.move(78);

    bird.move();
    //bird.move(1727);当程序如果运行这一句会报错:
    //no matching function for call to'Bird::move(int)'

    pig.move();
    //pig.move(21);

    return 0;
 }


C++中函数重载只能在同一个类中,因为子类中的函数会遮掩住父类中的同名函数。但是使用using 申明式可以使得父类中的同名函数在子类中可见,从而实现函数重载。实现代码如下所示:

#include <iostream>
class Base
{
public:
    void fun(int data)
    {
    std::cout<<"我是int!!!"<<std::endl;
    }
};

class Derivd:public Base
{
public:
    using Base::fun;//这里using申明式可以使得父类中被遮掩住的同名函数在子类中可见,从而在子类中实现函数重载。
    void fun(double data)
    {
    std::cout<<"我是double!!!"<<std::endl;
    }
};

int main()
{
    Derivd d;
    d.fun(1);
    d.fun(1.2);
    return 0;
}



子类调用基类的重载函数

#include <iostream>

class Base
{
public:
    void fun(double data)
    {
        std::cout<<"你好!我是double!"<<std::endl;
    }
    void fun(int data)
    {
    std::cout<<"你好!我是int!"<<std::endl;
    }
};

class Derivd:public Base
{
};

int main()
{
    Base b;
    b.fun(1);
    b.fun(1.2);

    Derivd d;
    d.fun(1);
    d.fun(1.2);

    return 0;
}



关于上上上一个程序所提到的问题,即在子类对基类某函数进行了覆盖的情况下,基类中的重载函数无法被子类调用,好像可以这么解决

#include <iostream>

class Base
{
public:
    void fun(double data)
    {
        std::cout<<"你好!我是double!"<<std::endl;
    }
    void fun()
    {
    std::cout<<"不知道说什么,基类函数里的"<<std::endl;
    }
};

class Derivd:public Base
{
public:
    using Base::fun;
    void fun()
    {
        std::cout<<"哈哈,我是覆盖的哟!"<<std::endl;
    }
};

int main()
{
    Base b;
    b.fun();
    b.fun(1.2);

    Derivd d;
    d.fun();
    d.fun(1.2);

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值