成员函数的(重载,覆盖,虚函数,隐藏)

重载特点

  1. 同一个类中
  2. 不同的参数列表

覆盖特点

  1. 位于子类和父类
  2. 参数列表相同

虚函数特点

  1. 函数声明时带有关键字 virtual
  2. 通过父类指针完成多态

隐藏特点

  1. 位于子类和父类
  2. 函数名相同
  3. 若参数不同。此时,不论有无 virtual 关键字,父类的函数将被隐藏(注意别与重载混淆)
class Fruit
{
public:
	void priName(string s)
	{
		cout<<"水果"<<endl;
	}
};

class Apple :public Fruit
{
public:
	void priName(int a)
	{
		cout<<"苹果"<<endl;
	}
};

int main(int argc, char *argv[])
{
	Apple apple;
	apple.priName("266");//error
	return 0;
}

3. 若参数相同,但是父类函数没有 virtual关键字。此时,父类的函数被隐藏(注意别与覆盖混淆)

class Fruit
{
public:
	void priName(int s)
	{
		cout<<"水果"<<endl;
	}
};

class Apple :public Fruit
{
public:
	void priName(int a)
	{
		cout<<"苹果"<<endl;
	}
};

int main(int argc, char *argv[])
{
	Apple apple;
	apple.priName("565");//error
	return 0;
}
时间: 2024-10-09 12:59:30

成员函数的(重载,覆盖,虚函数,隐藏)的相关文章

虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数-&gt;抽象类,基类虚析构函数使释放对象更彻底

为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) 1 #include<iostream> 2 using namespace std; 3 4 class base{ 5 public: 6 /*virtual*/ void who(){ //define this function to virtual will be normal 7 cout << "this is th

【C++】多态性(函数重载与虚函数)

多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. 运行时多态性:不同对象在收到相同消息时产生不同的动作,一般通过虚函数来实现,只有在运行时才能实现绑定,属于动态绑定. 虚函数 虚函数是在基类中用关键字virtual 标识的成员函数,可以在一个或多个派生类中被重新定义.如果一个函数被定义为虚函数,那么,即使是使用指向基类对象的指针来调用该成员函数,也

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

&lt;C++&gt; 类(3):初始化列表 常函数和常量对象 虚函数与多态(包括纯虚函数)

一.初始化列表(初始化列表中必须有的两个内容) 1.类中const的成员变量: ①特点:不能修改 必须初始化 在构造函数后面加冒号 格式为:":变量名(值)" 也就是说 常量必须在初始化列表中初始化 ②执行顺序:构造函数先执行初始化列表 然后执行函数中的内容 1 #include<iostream> 2 using namespace std; 3 4 class CPerson 5 { 6 public: 7 const int a; 8 public: 9 CPerso

C++中为什么构造函数不能是虚函数,析构函数是虚函数

一, 什么是虚函数? 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略. 所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟

详细讲解什么函数不能声明为虚函数

什么函数不能声明为虚函数? 一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的. 但设置虚函数须注意: 1:只有类的成员函数才能说明为虚函数: 原因:普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数. 2:静态成员函数不能是虚函数: 因为static属于class自己的,也必须有实体: 没有this指针,它无法进行对象的判别. 3:内联函数不能为虚函数: 原因: inline是编译时展开,必须有实体:内联函数就是

TControl的显示函数(5个非虚函数,4个虚函数)和三个例子的执行过程(包括SetParent的例子)

// 9个显示函数 procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual; // 虚函数,important 根据父控件 // 手法:固定不变的模式,或者简单调用,或者简单设置标志位,就不是虚函数. procedure Show; // 设置自己和所有祖先的visible标识 procedure Hide; // 简单设置visible标识,与祖先无关 procedure Refresh; // 简单调用Repai

类虚函数表原理实现分析(当我们将虚表地址[n]中的函数替换,那么虚函数的实现就由我们来控制了)

原理分析 当调用一个虚函数时, 编译器生成的代码会调用 虚表地址[0](param1, param2)这样的函数. 已经不是在调用函数名了. 当我们将虚表地址[n]中的函数实现改为另外的函数, 虚函数的实现就由我们来控制了. 实验 根据虚表原理, 实验一下修改自己程序的虚函数表项地址. 使编译器生成的代码执行一个虚函数A时, 执行的是我们自己定义的非虚函数B. 知识点 * 使用union赋值, 绕过编译器函数与变量强转赋值的限制 * 类成员函数指针的执行 * 修改和恢复自己的代码段属性 * 虚函

C++面试题1:构造函数和虚构函数中能否调用虚函数?

C++面试题1:构造函数和虚构函数中能否调用虚函数? 构造函数跟虚构函数里面都可以调用虚函数,编译器不会报错. C++ primer中说到最好别用 由于类的构造次序是由基类到派生类,所以在构造函数中调用虚函数,虚函数是不会呈现出多态的 类的析构是从派生类到基类,当调用继承层次中某一层次的类的析构函数时意味着其派生类部分已经析构掉,所以也不会呈现多态 因此如果在基类中声明的纯虚函数并且在基类的析构函数中调用之,编译器会发生错误. class Base { public: Base() { Fuct

在虚函数的声明的参数列表后加上“=0”就将函数变成了纯虚函数

在虚函数的声明的参数列表后加上“=0”就将函数变成了纯虚函数class Base{ virtual void function()=0;}我们不需要为纯虚函数Base::function()提供任何定义,那些声明了纯虚函数的类就是抽象类.任何试图创建一个抽象类对象的操作都会导致编译器错误.如果一个派生Base并且重写了Base::function()函数,它就成为了具体的类.class Derived :public Basae { void function(); } 通常将抽象类用作接口声明