网站开发 私活,wordpress 4.8 中文包,丽江建设局网站,百度收录提交工具一.什么是多态
多态是在有继承关系的类中#xff0c;调用同一个指令#xff08;函数#xff09;#xff0c;不同对象会有不同行为。
二.什么是虚函数
概念#xff1a;首先虚函数是存在于类的成员函数中#xff0c;通过virtual关键字修饰的成员函数叫虚函数。
性质调用同一个指令函数不同对象会有不同行为。
二.什么是虚函数
概念首先虚函数是存在于类的成员函数中通过virtual关键字修饰的成员函数叫虚函数。
性质如果在基类中定义类的虚函数那么在派生类中该函数被继承下来仍是虚函数即使派生类中没有加virtual
重写覆盖派生类要保证该虚函数的名字返回类型参数列表都要相同。在发生重写时除了虚函数的函数体之外其他的都是在编译的时候确定的。
三.虚函数的实现机制
当基类定义了虚函数在该类创建对象时就会在对象的存储布局的前面新增一个虚函数指针该指针指向虚函数表简称虚表在虚表中存有虚函数的入口地址。当派生类继承基类的时候会吸收基类的成员函数包括虚函数那么派生类中也会有虚函数在派生类创建对象时也会在派生类对象的存储布局前面新增一个虚函数指针该指针也会指向派生类自己的虚函数表该表存有派生类虚函数的入口地址。如果派生类重写了从基类吸收的虚函数那么就会用派生类自己的虚函数的入口地址覆盖从基类吸收过来的虚函数入口地址。 四.虚函数机制被激活的条件
基类定义虚函数派生类重写该虚函数创建派生类对象基类指针指向基类引用绑定派生类对象使用基类指针或引用调用派生类虚函数
#include iostreamusing std::endl;
using std::cout;class Base
{
private:int _ix;
public:Base(int x0):_ix(x){coutBase(int x0)endl;}~Base(){cout~Base()endl;}virtualvoid print()const{coutBase::_ix _ixendl;}
};class Derived
:public Base
{
private:int _iy;
public:Derived(int x0,int y0):Base(x),_iy(y){coutDerived(int x0,int y0)endl;}~Derived(){cout~Derived()endl;}void print()const{coutDerived::_iy _iyendl;}};
void func(Base* base)
{base-print();
}
void test()
{Base base(3);Derived derived(33,44);func(base);func((Base*)derived);func(derived);
}
int main()
{test();return 0;
} 如果不加虚函数会是什么样呢 五.哪些函数不能设置虚函数
普通函数包括自由函数和全局函数虚函数必须是成员函数而普通函数是非成员函数。内联成员函数内联成员函数进行函数替换是发生在编译的时候而虚函数要实现多态要发生在运行的时候如果将内联函数设置成虚函数就会失去内联的意义。静态成员函数静态成员函数发生在编译的时候而虚函数要体现多态发生在运行的时候静态成员函数是共享的被该类所有对象共享没有this指针。友元函数如果友元函数本身是一个普通函数那么友元函数不能被设置成虚函数。如果友元函数本身是另外一个类的成员函数是可以被设置成虚函数的但友元关系不能被继承。构造函数构造函数不能被继承但是虚函数可以被继承。
六.纯虚函数 定义形式 virtual 返回类型 函数名参数列表0; 其中在类中声明纯虚函数该类被称作抽象类不能创建对象只提供接口作用。纯虚函数的实现放在派生类中如果派生类没有把基类的纯虚函数全部都实现那么派生类也是抽象类同样不能创建对象。虽然不可以创建对象但是抽象类可以创建抽象类的指针因为指针相当于地址在64位系统中无论什么指针大小都是8个字节只不过指针的指向数据的跨度不同但是创建指针是可以的。 其中override表示重写基类的成员函数如果没有重写就会报错。
#include iostream
using std::endl;
using std::cout;class Base
{
public:virtual void print() const 0;
};class Derived
:public Base
{void print() const override{coutDerived::print()constendl;}
};void test()
{//Base base; errorDerived derived;Base* pbase;pbasederived;pbase-print();
}
int main()
{test();return 0;
}