没有网站也可以做推广吗,三门峡做网站推广,珠宝静态网站模板,快速做网站套餐文章目录 一、多态的概念二、多态使用三、多态的原理 一、多态的概念
1、概念#xff1a; 多态就是具有多种形态#xff0c;可以理解为同一个行为不同对象去完成表现出不同的状态#xff0c;如#xff1a;
二、多态使用
1、构成多态的条件 #xff08;1#xff09;派… 文章目录 一、多态的概念二、多态使用三、多态的原理 一、多态的概念
1、概念 多态就是具有多种形态可以理解为同一个行为不同对象去完成表现出不同的状态如
二、多态使用
1、构成多态的条件 1派生类要对基类虚函数进行重写。 2通过基类指针或引用调用虚函数。
2、虚函数 关键字virtual加在函数声明前面并且该函数是非静态成员函数。 如 3、函数重写 1条件 派生类重写的函数返回值、函数名称、函数参数与基类相同。
2使用
class Person {
public:
//虚函数virtual void test01(){//...}
};
class Student : public Person {
public://重写 virtual关键字在派生类中写不写都可virtual void test01(){//...}
};3例外 协变 派生类重写基类虚函数时与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指 针或者引用派生类虚函数返回派生类对象的指针或者引用时称为协变。
class Person {
public:virtual Person test01(){//...}
};
class Student : public Person {
public://重写 返回值是继承关系virtual Student test01(){//...}
};析构函数 如果基类的析构函数为虚函数此时派生类析构函数只要定义无论是否加virtual关键字 都与基类的析构函数构成重写虽然基类与派生类析构函数名字不同。虽然函数名不相同 看起来违背了重写的规则其实不然这里可以理解为编译器对析构函数的名称做了特殊处 理编译后析构函数的名称统一处理成destructor。
如果出现以下情况就会出现子类没有析构
class Person {
public:~Person() { cout ~Person() endl; }
};
class Student : public Person {
public:~Student() { cout ~Student() endl; }
};void test()
{//情况//不重写析构函数时Person* p new Student;delete p;
}如果重写之后调用调用子类的析构子类的析构再去调用父类析构就不会出现以上情况了。
class Person {
public:virtual ~Person() { cout ~Person() endl; }
};
class Student : public Person {
public:~Student() { cout ~Student() endl; }
};void test()
{Person* p new Student;delete p;
}3重载、重定义隐藏、重写的区别 重载同一作用域下函数名相同参数类型、个数、顺序不同。 重定义作用域不同派生类域、基类域函数名相同。 重写作用域不同派生类域、基类域必需是虚函数函数名相同、返回类型相同、参数相同。 4使用多态
class Person {
public://虚函数virtual void test01() {cout Person endl;}
protected:int _a;
};class Student : public Person {
public:virtual void test01() {cout Student endl;}
protected:int _b;
};void Print(Person* pp)
{pp-test01();
}void test()
{Person p;Student s;//基类对象传给基类指针pppp还是基类 -不构成多态依然使用基类的函数Print(p);//派生类对象传给基类指针pppp指向的是派生类- 构成多态使用的是派生类重写的函数Print(s);
}4、抽象类 1纯虚函数 在虚函数声明后面加上 0 就是纯虚函数了。
virtual void test01() 0;2 拥有纯虚函数的类叫做抽象类抽象类不能被实例化当派生类继承抽象类后必须重写抽象类中的纯虚函数不然该派生类依旧还是抽象类不能被实例化。
//抽像类
class Person {
public://纯虚函数virtual void test01() 0;
};
class Student : public Person {
public://重写纯虚函数virtual void test01(){cout virtual void test01() endl;}
};三、多态的原理
1、虚函数表 一个类中存在虚函数是会生成一个指针该指针指向的内容就是虚函数表。 在x86环境下
//抽像类
class Person {
public://虚函数virtual void test01() {};
protected:int _a;
};void test()
{Person p;cout sizeof(Person) endl;
}当派生类继承基类时也会产生一个虚函数指针该指针指向的内容一部分是从父类继承下来的一部分是重写的。 test01()使用了派生类的test02()没有重写还是使用基类的。
2、多态原理
满足多态以后的函数调用不是在编译时确定的是运行起来以后到对象的中取找的。不满足多态的函数调用时编译时确认好的运行时确定。
3、动态绑定和静态绑定
静态绑定又称为前期绑定(早绑定)在程序编译期间确定了程序的行为也称为静态多态 比如函数重载动态绑定又称后期绑定(晚绑定)是在程序运行期间根据具体拿到的类型确定程序的具体 行为调用具体的函数也称为动态多态。
4、多继承与多态
class Person1{
public://虚函数virtual void test01() {};protected:int _a;
};class Person2 {
public://虚函数virtual void test02() {};protected:int _b;
};class Student : public Person1, public Person2 {
public://重写Person1void test01(){}//重写Person2void test02() {}void test03(){}
protected:int _b;
};void test()
{Student s;
}多继承时每个基类会生成相应的虚函数指针。