1.虚函数
#include<iostream>
using namespace std;
/**
C++中的虚函数
**/
class Base{// 基类
public:
virtual void func(){
cout<<"Base Function"<<endl;
}
};
class Derived:public Base{// 派生类
public:
void func(){
// 子类中的同名函数
/**
当子类中包含与父类中同名的成员函数时
如果父类中的同名成员函数没有被声明为虚函数
则子类将使用自己的同名函数(相当于对父类方法进行了重写)
**/
cout<<"Derived Function"<<endl;
}
};
void foo(Base &b){
b.func();
}
int main(){
Base b;
Derived d;
/**分别声明父类对象和子类对象**/
Base *p=&d;// 父类指针,指向子类对象
Base &br=d;// 父类引用,指向子类对象
b.func();// 父类对象,调用父类的成员函数
d.func(); // 子类对象,调用子类的成员函数
p->func();// 父类指针,调用父类的成员函数
br.func();// 父类引用,调用父类的成员函数
return 0;
}
/**
当出现子类继承父类时,如果出现同名函数
(1)对于实例化后的父类对象和子类对象,则无论同名函数是否为虚函数
都根据实例化后的对象调用相应的函数
(2)当父类的指针或引用调用同名函数时
如果父类的同名函数不是虚函数:则直接根据指针或引用的类型(即父类),调用父类的同名函数即可
如果父类的同名函数是虚函数,则它只能通过实例化后的对象被调用,而并不能通过指针或引用被调用
此时将会调用子类的同名函数
(即根据父类指针或引用实际指向的对象的类型来确定调用哪个版本的函数)
**/
/**
**/
#include<iostream>
using namespace std;
class Base{
public:
virtual void func(){
cout<<"Base Function"<<endl;
}
};
class Derived1:public Base{
public:
void func(){
cout<<"Derived1 Function"<<endl;
}
};
class Derived2:public Base{
public:
void func(){
cout<<"Derived2 Function"<<endl;
}
};
int main(){
Base b;
Derived1 d1;
Derived2 d2;
Base *p[3]={&b,&d1,&d2};
for(int i=0;i<3;i++){
p[i]->func();
}
/**
父类的指针或者引用调用同名函数时
如果父类的同名函数是虚函数,则根据父类的指针
和引用实际指向的对象调用相应的成员函数
否则:则直接调用父类的成员函数
这样可以实现类似C语言中的函数指针
方便地调用不同类的同名成员函数
**/
return 0;
}
虚函数的意义:当父类指针或引用指向子类对象时,调用子类版本函数,则可以使用虚函数
(1)有了虚函数之后,就可以正确地使用指向父类的指针和引用,使其能够正确调用子类的同名函数(如果不用虚函数,则无论父类的指针或引用实际指向的对象是什么类型,都调用父类的同名函数)
(2)虚函数的目的:真实地反映出父类指针或引用实际指向对象的真实情况。
(3)调用虚函数时,到底调用哪个版本,是根据指针或引用实际指向的对象的类型来确认,而不是调用者本身的类型来确定。
2.static关键字是什么
static关键字所修饰的全局变量只能在本文件内部使用,不能被其他文件所调用或修改。
C++中的参数传递:
传递的参数是基本数据类型:传值
传递的参数是数据类型的引用:传地址