【c++】访问控制、覆盖方法和重载方法
来源:互联网 发布:海关数据怎么贩卖 编辑:程序博客网 时间:2024/05/17 21:55
一、访问控制
访问级别
级别允许谁来访问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
- 【c++】访问控制、覆盖方法和重载方法
- 方法覆盖和方法重载
- 方法重载和方法覆盖
- 【C++】【学习笔记】【019】覆盖方法和重载方法
- java方法重载和覆盖
- 方法的重载和覆盖
- Objective-C 中方法的重载,覆盖和隐藏
- Objective-C 的方法原型及重载和覆盖
- Objective-C 的方法原型及重载和覆盖
- 方法重载、方法覆盖和多态
- 细说C++覆盖方法和重载方法
- java方法重载和方法覆盖
- Java---方法重载和方法覆盖
- 方法重载和方法覆盖的区别
- java方法覆盖和方法重载
- C#:区分:重写、覆盖和重载以及虚方法和抽象方法
- java方法的重载、覆盖和隐藏
- C#之方法重载和覆盖
- python猜数字游戏
- FTPrep, 47 Permutation II
- POJ 1952-最长下降子序列+去重
- 最流行的android组件大全
- 格式转换语法
- 【c++】访问控制、覆盖方法和重载方法
- 关于数据库一些使用操作方法
- 关于lib/asm-offsets.c:1:0: error: bad value (armv5) for -march= switch问题解决办法
- 图结构练习——BFSDFS——判断可达性
- SpringMVC之 HandlerAdapter和handlerMapping
- 修改Placeholder默认的字体颜色
- linux学习之旅(二十二)&CIFS网络文件系统
- 图形学——Make Some Noise
- 设计模式之建造者模式