虚函数
虚函数是面向对象编程中函数的一种特定形态,是C++中用于实现多态的一种有效机制
虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
在面向对象的编程中,首先会针对数据进行抽象(确定基类)和继承(确定派生类),构成类层次,通过引入虚函数概念来构成多态,便于复写。
final和override说明符
overload约定成俗的被翻译为“重载”。是指编写一个与已有函数同名但是参数表不同的函数,是对于基类的重写。
final是规定不许后续的其他类覆盖该函数,不可重写
动态绑定
虚函数的调用可能在运行阶段才被绑定,当我们使用基类引用或指针调用一个虚函数成员会执行动态绑定,注意当且仅当对通过指针或引用调用虚函数时,才会在运行时候解析调用,也只有这种情况下静态类型与对象的动态类型不一致
class Str
{
public:
Str() = default;
Str(int a, int b) : t(a), nums(b) {
}
virtual void fun() {
cout << t + nums << endl; }
virtual ~Str()=default;
private:
int t;
int nums;
};
class strles : public Str
{
public:
strles() = default;
strles(int a, int b, int c) : Str(a, b), cul(c){
};
virtual void fun() override;
private:
int cul;
};
void strles::fun()
{
cout << cul << endl;
}
int main()
{
Str a(3, 4), *b;
strles c(3, 4, 5), *d;
b = &c;
a.fun();
b->fun();
c.fun();
return 0;
}
此处*b进行动态绑定,只有在编译时才知道其类型,且基类析构函数为虚函数。
注意
1、纯虚函数声明如下: virtual void funtion1()=0; 纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。
2、虚函数声明如下:virtual ReturnType FunctionName(Parameter) 虚函数必须实现,
3.析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。
4.友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。