1.作用域不同
2.函数一模一样
3.需要有virtual关键字(基类),派生类可有可无
1.作用域一样
2.函数名一样
3.参数不同
1.作用域不同
2.函数名一样
3.参数一样,基类不能有virtual
4.参数不一样,基类有没有virtual都是隐藏
当类里面有虚函数时
类的对象前八个字节会存储虚函数表的首地址
虚函数表存储对应类的虚函数的地址
1.构造函数不能是虚函数
2.析构函数最好是虚函数
3.纯虚函数(拥有纯虚函数的类叫做抽象类)
验证虚函数表存在的代码
#include
using namespace std;
typedef unsigned long u64;
typedef void (*FUNC)(void);
class Base
{
public:
virtual void fun()
{
cout<<"func"<<endl;
}
private:
int i ;
};
class Inhirt:public Base
{
public:
void fun()
{
cout<<""<<endl;
}
};
int main()
{
Base *p = new Base;
u64 *q = (u64*)p;//转位8位一个单位的指针
#if 0
u64 *t = (u64*) *q;//获取指向虚函数的指针,即最开始的8位
FUNC f = (FUNC) *t;//转换虚函数表第一个的值的类型
f();
#else
FUNC f = (FUNC)((u64 *)q[0])[0];
f();
#endif
return 0;
}
把构造函数写成非public
面向对象编程模式
经典编程模式一共有23种
1.单例模式,一个类只能创建唯一一个对象
1.限制构造
2.static
思路,构造函数作为限制构造,在类的内部写一个函数去调用构造函数(static),有一个指针变量保存创建处理的空间(static变量),
1.规范接口(纯虚函数), 2.实现多态(虚函数表)3.继承
一、简单工厂模式
1.产品基类 抽象类
2.派生具体的产品类
3.工厂类
二、工厂方法模式 生产简单产品
1.产品基类 抽象类(产品属性)
2.派生具体的产品A类
派生具体的产品B类
3.工厂类 抽象类 (生产的方式)
4.具体的工厂类A
5.具体的工厂类B
三、抽象工厂模式 生产复杂的产品
工厂方法模式
#include
using namespace std;
class Product
{
public:
virtual void fun() = 0;
};
class Product_A:public Product
{
public:
void fun()
{
cout<<"A A A"<<endl;
}
};
class Product_B:public Product
{
public:
void fun()
{
cout<<"B B B"<<endl;
}
};
class Factor:public Product_A,public Product_B
{
public:
virtual Product* creat() = 0 ;
};
class Factor_A:public Factor
{
public:
Product* creat()
{
return new Product_A;
}
};
class Factor_B:public Factor
{
public:
Product* creat()
{
return new Product_B;
}
};
int main()
{
//创建工厂
Factor * fa = new Factor_A;
Factor * fb = new Factor_B;
//创建物品
Product * pa = fa->creat();
Product * pb = fb->creat();
//展示物品
pa->fun();
pb->fun();
return 0;
}