结合着继承,这边加了个模板。模板是支持虚函数,指出多态的。跟普通虚继承调用没有什么太多的差别,多了一步前面补上一个类型然后和正常一样,创建基类指针指向派生类的对象或者新开辟的空间。
template<typename T>
class A {
public:
virtual void test() {
cout << "1";
}
T *p;
};
template<typename T>
class B :public A<int>
{
public:
virtual void test() {
cout << "2";
}
T *p;
};
int main() {
A<int>*aaa = new B<int>();
aaa->test();
}
这边先学习一下这个关键字typedef,这个关键字是起别名的作用。写法是typedf 变量名 别名
下面这个是对结构体起别名的两种方法--
struct a {
int name;
string age;
};
typedef a ok;
typedef struct b {
int aname;
string sage;
}ls;
同时 模板也是支持函数重载的
----
将宏和模板结合到一起
#define hello(name,code,Fcc,...)\
template <typename T>\
class F##name{\
public:\
void test(){\
printf(Fcc,__VA_ARGS__);\
code;\
}\
private: T*a;\
};
hello(s, cout << "ok" << endl,"%s","hello ccc")
int main() {
Fs<int> a;
a.test();
}
--------------
单列
初级单列的设计模式
class single {
public:
static single *get() {
if (ins == nullptr) {
ins = new single();
}
}
private:
static single *ins;
single() {};
~single() {cout<<"ok";};
single(const single &clone) {};
single &operator=(const single);
};
single *single::ins = nullptr;
就是这么写会出现一个问题,就是无法调用析构函数来delete产生内存泄漏。
模板配合单列来使用
//头文件里
template<typename T>
class FThread {
public:
static T*get() {
if (! instance) {
in