一、多态中的动态多态

1)动态多态通过一个关键字virtual构造一个虚函数,这样,对象在调用某一个方法根据当前对象的所属类去动态绑定对应方法。

2)虚函数:在一个类中,virtual关键字修饰的成员函数,我们将该函数叫虚函数。

虚函数分为:虚函数和纯虚函数

纯虚函数在类中只有声明,没有定义,它的定义由子类对其重写,为了和传统的成员的声明做区分函数的声明结尾加上=0;

3)抽象类:凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。多用来实现一些接口。

4)动态多态它是建立在继承前提下,在基类中声明了一个虚成员函数,此时,其子类对其重写时,可以不用显示指定virtual,对于基类中声明的虚函数,需要靠基类来实现重写。

5)从面相对象的角度,多态就是在调用对象的方法,根据当前对象的不同所表现出的不同行为。

6)override关键字的使用

在派生类的成员函数中使用override时,如果基类中无此函数,或者基类中的函数并不是虚函数,编译器会给出相关错误信息。例如

#include <iostream>
using namespace std;
class per
{
public:
//string name;
virtual void eat()
{
cout<<"parent"<<endl;
}

};

class stu : public per
{
public:
virtual void eat()
{
cout << "stu can eatting" << endl;
}
};

class Tea : public per
{
public :
virtual void eat() override
{
cout << "tea can eatting" << endl;
}
};

void make_obj(per& a)
{
a.eat();
}

int main()
{
stu s1;
Tea s2;
make_obj(s1);
make_obj(s2);
return 0;
}

C++之动态多态_C++动态多态

C++之动态多态_C++动态多态_02



空类1

只有数据成员的情况8

带静态数据成员的情况2

带数据成员和普通成员函数的情况8

带数据成员和虚成员函数的情况12

例子:

#include <iostream>
using namespace std;



class per1
{


};
class per2
{
public:
int a;
short b;
};

class per3
{
public:
static int a;
short b;
void get()
{
cout << sizeof(a) << endl;
}

};

class per4
{
public:
int a;
short b;
void print()
{
cout << "3333" << endl;
}
};
class per5
{
public:
int a;
short b;
virtual void print()
{
cout << "3333" << endl;
}
virtual void print1()
{
cout << "33331" << endl;
}
};

class per6
{
public:
enum data {
AA,
BB,
CC
};
};

int main()
{
//创建的类如果没有任何的成员,占用1个字节,用这个字节标识不同的对象
per1 a1;
cout << "空类" << sizeof(a1) << endl;
//只有数据成员
per2 a2;
cout << "只有数据成员的情况" << sizeof(a2) << endl;
per3 a3;
a3.get();
cout << "带静态数据成员的情况" << sizeof(a3) << endl;
per4 a4;
cout << "带数据成员和普通成员函数的情况" << sizeof(a4) << endl;

per5 a5;
cout << "带数据成员和虚成员函数的情况" << sizeof(a5) << endl;

static int a;
cout << "static a =" << sizeof(a) << endl;

per6 a6;
cout << per6::AA << endl;
cout << sizeof(per6) << endl;

enum data1 {
AA,
BB,
CC
};
cout << sizeof(data1) << endl;


return 0;
}

C++之动态多态_C++动态多态_03


#include <iostream>
#include <string>
using namespace std;

template <class A, class B> // 模板声明
class myper
{
public:
A name;
A sex;
B age;
myper(A n, A s, B a);

myper() {
name = "sd";
sex = "a3";
age = 12;
}
void print()
{
cout << this->name << this->age << this->sex;
}
void print1();


};

template <class A, class B>
myper<A, B>::myper(A n, A s, B a) :name(n), sex(s), age(a)
{
;
}
//一个类被定义为类模板,无论内部的成员函数是否用到类型符号,在外部定义时都需要
//加上模板声明
template <class A, class B>
void myper<A, B>::print1()
{
cout << 3333;
}
int main()
{
myper<string, int> p1("sdfds", "waa", 14);
p1.print();
//add(10, "ljs"); //使用模板函数:自动推导
//显示指定类型使用模板函数:函数返回类型 函数名<显式指定的类型,...>(参数列表);
//add<int,string>(33, "kk");
return 0;
}