• 全部
...

C++ 面向对象(类和对象)—— 类模板

微软技术分享 微软全球最有价值专家
全栈领域优质创作者
博客专家认证
2025-06-07 07:59:45

文章目录

类模板

类模板(Class Template)C++ 中的一种模板机制,用于创建通用类的框架,它允许程序员定义一个类时,类中的某些成员(如数据类型)可以是参数化的类模板 的核心作用是提高代码的复用性和灵活性,同时避免重复编写相似的代码。

一、类模板的语法

类模板 的作用:

  • 建立一个通用类,类中成员的数据类型可以不具体制定,使用一个 ** 虚拟类型** 来代表

语法:

语法:template <class T> + 后紧跟 + 类声明或定义
紧跟的这一部分(类声明或定义)就叫做类模板

template ---> 声明创建模板
class---> 表示其后面的符号是一种自定义数据类型
T ---> 通用的数据类型(虚拟数据类型),名称可替换

  1. C++
  2. template<class T>--->模板参数列表

解释:

template — 声明创建模板

typename — 表其后面的符号是一种数据类型,可使用 class 代替

T — 通用的数据类型,名称可以替换,通常为大写做字母

重点:

  • 数据类型参数化(将数据类型像参数般,传至模板的参数列表中)

类模板的基础实现:

  1. C++
  2. #include<iostream>
  3. using namespace std;
  4. #include<string>
  5. template<class NameType, class AgeType>
  6. class Person
  7. {
  8. public:
  9. Person(NameType name, AgeType age)
  10. {
  11. this->Name = name;
  12. this->Age = age;
  13. }
  14. void shouPerson()
  15. {
  16. cout << "Name == " << this->Name
  17. << " Age == " << this->Age << endl;
  18. }
  19. NameType Name;
  20. AgeType Age;
  21. };
  22. void test01()
  23. {
  24. //类型参数化(将数据类型像参数一样传入模板的形参列表)
  25. // <> -- 模板的参数列表
  26. Person<string, int> p1("啦啦啦", 18);
  27. p1.shouPerson();
  28. }
  29. int main()
  30. {
  31. test01();
  32. return 0;
  33. }

https://i-blog.csdnimg.cn/direct/45fe1642867f4fcc86899f8c82e188ab.png


总结:类模板函数模板语法相似,在声明模板 template 后加 class ,此类就被称为类模板


二、类模板与函数模板

类模板 与 函数模板区别主要有两点:

​ 1.类模板中没有自动类型推导的使用

​ 2.类模板在模板参数列表中可以有默认参数


2.1类模板 - 无法自动类型推导

  • 自动类型推导
  1. C++
  2. void test01()
  3. {
  4. Person p1("啦啦啦", 18);
  5. }

https://i-blog.csdnimg.cn/direct/55eb1084d5814354a264e7c71c615927.png


  • 只能使用 显示指定类型转换
  1. C++
  2. void test01()
  3. {
  4. Person<string, int> p1("啦啦啦", 18);
  5. }

2.2参数列表中的默认参数

  • 类模板在模板参数列表中可以有默认参数
  1. C++
  2. //模板参数列表<> 默认参数 int
  3. template<class NameType, class AgeType = int>
  4. class Person
  5. {
  6. public:
  7. ...
  8. };
  9. void test02()
  10. {
  11. Person<string> p2("呦呦呦", 3);
  12. }

https://i-blog.csdnimg.cn/direct/6e273003c26642318f141271d888dbac.png


总结:

  • 类模板中只能使用显示指定类型方式
  • 类模板中的模板列表可以有默认参数

三、类模板中成员函数的创建时机

类模板中成员函数和普通成员函数创建时机是有区别的

  • 普通类中的成员函数在一开始就可以创建
  • 类模板中的成员函数在调用时才创建(类模板中的成员函数在程序运行时,不会立即被创建,只有当其被调用时,才会进行创建)
  1. C++
  2. class Person1
  3. {
  4. public:
  5. void ShowPerson1()
  6. {
  7. cout << "Person1 Show" << endl;
  8. }
  9. };
  10. class Person2
  11. {
  12. public:
  13. void ShowPerson2()
  14. {
  15. cout << "Person2 Show" << endl;
  16. }
  17. };
  18. //虚拟类型(通用数据类型) T
  19. template<class T>
  20. class My_Class
  21. {
  22. public:
  23. //通过 虚拟类型(通用类)T 在模板类 My_Class 中实例化出了 "类对象 obj"
  24. T obj;
  25. //类模板中的成员函数
  26. void func1()
  27. {
  28. obj.ShowPerson1();
  29. }
  30. void func2()
  31. {
  32. obj.ShowPerson2();
  33. }
  34. //只要不去调用成员函数,func1() 以及 func2() ,func1()、func2()就不会被创建
  35. //因为 编译器无法确定被虚拟类型实例化出的对象 obj 到底是什么数据类型
  36. //一筹莫展
  37. //因此 这就导致了类模板中的成员函数在一开始不会被创建(因为函数自身也无法区分其属于什么数据类型),只有被调用时才会被创建
  38. };
  39. void test01()
  40. {
  41. My_Class<Person1> c1;
  42. c1.func1();
  43. c1.obj.ShowPerson1();
  44. My_Class<Person2> c2;
  45. c2.func2();
  46. c2.obj.ShowPerson2();
  47. }

https://i-blog.csdnimg.cn/direct/cb6b416ab849425db8ab2bf01e4ea5a9.png


  1. C++
  2. void test01()
  3. {
  4. My_Class<Person1> c1;
  5. c1.func1();
  6. c1.func2();//---> false
  7. c1.obj.ShowPerson1();
  8. }

https://i-blog.csdnimg.cn/direct/9d2553c4f466458da30d0370eceb5664.png


总结:类模板中的成员函数并不是在一开始就创建的,其在被调用时才会被创建


四、类模板对象做函数参数

学习目标:

  • 类模板实例化出的对象,向函数传参的方式

一共有三种传入方式:

  • 指定传入的类型 — 直接显示对象的数据类型(常用)
  • 参数模板化 — 将对象中的参数变为模板进行传递
  • 整个类模板化 — 将这个对象类型 模板化进行传递

示例:

  1. C++
  2. //先声明一个类模板
  3. template<class TypeName, class TypeAge>
  4. class Person
  5. {
  6. public:
  7. Person(TypeName name, TypeAge age)
  8. {
  9. this->Name = name;
  10. this->Age = age;
  11. }
  12. void ShowPerson()
  13. {
  14. cout << "姓名:" << this->Name
  15. << " 年龄:" << this->Age << endl;
  16. }
  17. TypeName Name;
  18. TypeAge Age;
  19. };

4.1指定传入类型

  • 项目开发中常用的方式
  1. C++
  2. //1、指定传入的类型 - 引用的方式传递,直接拿到 p1 的本体
  3. void printPerson1(Person<string, int>& p)
  4. {
  5. p.ShowPerson();
  6. }
  7. void test01()
  8. {
  9. Person<string, int> p1("啦啦啦", 18);
  10. printPerson1(p1);
  11. }

https://i-blog.csdnimg.cn/direct/b36e61b5e5834024a8fa3d303bec1b21.png


4.2参数模板化

  • 告诉编译器 函数printPerson2 中的 <TypeName, TypeAge> 是模板中的两个参数
  1. C++
  2. void printPerson2(Person<TypeName, TypeAge>& p)
  3. {
  4. p.ShowPerson();
  5. }
  6. void test02()
  7. {
  8. Person<string, int> p1("呦呦呦", 3);
  9. printPerson2(p1);
  10. }

https://i-blog.csdnimg.cn/direct/e2400f0a2f154f9b99510480176e2b45.png


  1. C++
  2. template<class TypeName, class TypeAge>
  3. void printPerson2(Person<TypeName, TypeAge>& p)
  4. {
  5. p.ShowPerson();
  6. }
  7. void test02()
  8. {
  9. Person<string, int> p1("呦呦呦", 3);
  10. printPerson2(p1);
  11. }

https://i-blog.csdnimg.cn/direct/39a68d91adf04fdd8729af31dc5331e8.png


4.2.1查看参数 T 中的数据类型
  • 利用库函数 typeid 查看虚拟类型 T 推导出的数据类型
  1. C++
  2. template<class TypeName, class TypeAge>
  3. void printPerson2(Person<TypeName, TypeAge>& p)
  4. {
  5. p.ShowPerson();
  6. cout << "TypeName 的数据类型为:" << typeid(TypeName).name() << endl;
  7. cout << "TypeAge 的数据类型为:" << typeid(TypeAge).name() << endl;
  8. }

https://i-blog.csdnimg.cn/direct/805561da5a9b4eb1877f1fc43d022a1a.png


4.3整个类模板化

  • 直接将类作为模板(而非仅仅实例化出的对象)
  1. C++
  2. template<class T>
  3. void printPerson3(T& p)
  4. {
  5. p.ShowPerson();
  6. cout << "T 的数据类型为:" << typeid(T).name() << endl;
  7. }
  8. void test03()
  9. {
  10. Person<string, int> p("工藤新一", 18);
  11. printPerson3(p);
  12. }

https://i-blog.csdnimg.cn/direct/fc989d0c0f9d4ce78557c28b2967f8b9.png


总结:

  • 通过类模板创建的对象,有三种方式向函数中进行传参
  • 使用范围较广泛的一种是:指定传入类型

五、模板与继承

当类模板碰到继承时,需要注意以下几个点:

  • 当子类继承的父类是一个类模模板时,子类声明时要指定出父类中 T 的数据类型
  • 如果不指定,编译器无法为父类分配内存空间
  • 如果想灵活指定出父类中 T 的数据类型,子类也需要为类模板

示例:

  1. C++
  2. //类模板与继承
  3. template<class T>
  4. class Base {
  5. public:
  6. T b;
  7. };
  8. class Son : public Base--->false,必须要知道父类中 T 的类型,才能继承给子类
  9. {
  10. public:
  11. };

https://i-blog.csdnimg.cn/direct/19d837508ec3455b95a4ad80542a0f06.png


  1. C++
  2. //类模板与继承
  3. template<class T>
  4. class Base {
  5. public:
  6. T b;
  7. };
  8. class Son : public Base<int>
  9. {
  10. public:
  11. };

https://i-blog.csdnimg.cn/direct/468d641a77b94fa0a5ae4f797372fe1e.png


5.1灵活指定父类中 T 的类型

  • 想要灵活指定父类中 T 的类型,子类也需变成类模板
  1. C++
  2. //类模板与继承
  3. template<class T>
  4. class Base {
  5. public:
  6. T b;
  7. };
  8. template<class T1, class T2>
  9. class Son2 : public Base<T2>
  10. {
  11. public:
  12. T1 obj;
  13. };
  14. void test()
  15. {
  16. Son2<int, char> s2;
  17. }

https://i-blog.csdnimg.cn/direct/5c2c2f0ba5194b34a524908745543988.png

将数据类型像参数一样进行传递


  • 验证 T 的数据类型
  1. C++
  2. template<class T>
  3. class Base {
  4. public:
  5. T b;
  6. };
  7. template<class T1, class T2>
  8. class Son2 : public Base<T2>
  9. {
  10. public:
  11. //构造函数 - 编译阶段(实例化对象时,开始被调用)
  12. Son2()
  13. {
  14. cout << "T1 的数据类型为:" << typeid(T1).name() << endl;
  15. cout << "T2 的数据类型为:" << typeid(T2).name() << endl;
  16. }
  17. T1 obj;
  18. };
  19. void test()
  20. {
  21. Son2<int, char> s2;
  22. }

https://i-blog.csdnimg.cn/direct/279e3d5fbecf457db8f04349df3df5b7.png


总结:如果父类是类模板,那么子类需要指定出父类中 T 的数据类型


六、类模板成员函数的类外实现

学习目标:掌握类模板成员函数的类外实现

  1. C++
  2. //类模板成员函数的类外实现
  3. template<class T1, class T2>--->模板参数列表
  4. class Person
  5. {
  6. public:
  7. Person(T1 name, T2 age);
  8. void ShowPerson();
  9. T1 Name;
  10. T2 Age;
  11. };

6.1构造函数的类外实现

  1. C++
  2. //类模板 -- 构造函数的类外实现
  3. template<class T1, class T2>
  4. Person<T1, T2>::Person(T1 name, T2 age)
  5. {
  6. this->Name = name;
  7. this->Age = age;
  8. }

  1. C++
  2. 1、类模板参数列表的声明(告诉编译器 Person() 中的 T1、T2 是模板类型)
  3. |
  4. template<class T1, class T2>
  5. 2、<T1, T2>告诉编译器这是一个类模板的类外实现
  6. |
  7. Person<T1, T2>::Person(T1 name, T2 age)
  8. 不然 Person::Person(T1 name, T2 age)--->就和不同的成员函数类外实现没区别了

6.2成员函数的类外实现

  1. C++
  2. template<class T1, class T2>
  3. void Person<T1, T2>::ShowPerson()
  4. {
  5. cout << "姓名:" << this->Name
  6. << " 年龄:" << this->Age << endl;
  7. }

总结:类模板中的成员函数类外实现时,需要加入模板参数列表


七、类模板分文件编写

学习目标:

  • 掌握类模板成员函数分文件编写时产生的问题,以及解决方式

问题:

  • 类模板中成员函数创建时期是在调用阶段,导致分文件编写时链接不到

解决方法:

  • 法一:直接包含 .cpp 源文件
  • 法二:将声明和实现写到同一个文件中,并更改后缀为 .hpp (hpp 是约定的名称,而不是强制)

Person.h 文件中

  1. C++
  2. #pragma once
  3. #include<iostream>
  4. using namespace std;
  5. #include<string>
  6. //分文件的编写问题,以及解决
  7. template<class T1, class T2>
  8. class Person {
  9. public:
  10. Person(T1 name, T2 age);
  11. void ShowPerson();
  12. T1 Name;
  13. T2 Age;
  14. };

Person.cpp 文件中

  1. C++
  2. #include"Person.h"
  3. //模板类 - 成员函数的类外实现
  4. template<class T1, class T2>
  5. Person<T1, T2>::Person(T1 name, T2 age)
  6. {
  7. this->Name = name;
  8. this->Age = age;
  9. }
  10. template<class T1, class T2>
  11. void Person<T1, T2>::ShowPerson()
  12. {
  13. cout << "姓名:" << this->Name
  14. << " 年龄:" << this->Age << endl;
  15. }

ClassT.cpp 文件中

  1. C++
  2. #include"Person.h"
  3. void test01()
  4. {
  5. Person<string, int> p("啦啦啦", 14);
  6. p.ShowPerson();
  7. }
  8. int main()
  9. {
  10. test01();
  11. system("pause");
  12. system("cls");
  13. return 0;
  14. }

https://i-blog.csdnimg.cn/direct/b3dc840e5b1e468aa85d0eca222d23b3.png


7.1方法一:

  • ClassT.cpp 文件中 增添 #include"Person.cpp"

https://i-blog.csdnimg.cn/direct/0970071032ab4519a9cf3ed84cd07dd5.png


根据类模板函数创建时机 ----- “类模板中的成员函数在程序运行时,不会立即被创建,只有当其被调用时,才会进行创建”

在只包含 .h 文件时:

  1. C++
  2. #pragma once
  3. #include<iostream>
  4. using namespace std;
  5. #include<string>
  6. //分文件的编写问题,以及解决
  7. template<class T1, class T2>
  8. class Person {
  9. public:
  10. Person(T1 name, T2 age);
  11. void ShowPerson();
  12. T1 Name;
  13. T2 Age;
  14. };

编译器看到了如上代码,但其并不会在 .cpp 文件中生成这两个函数(Person()、ShowPerson()),编译器无法观察 / 产生到两函数的实现代码,并且直到代码运行结束,编译器也不会发现,两个函数的实现代码

这就导致了在链接阶段,无法解析外部命令


7.2方法二:

  • .p 头文件、.cpp 源文件写到一起,将文件后缀名更改为 .hpp 文件(即声明与实现(同床共枕)全在同一文件中),最后在 classT.cpp 文件中包含 #include”.hpp” 文件

八、类模板与友元

学习目标:

  • 掌握类模板配合友元的类内实现、类外实现
  • 友元修饰成员函数(友元函数)

全局函数类内实现 — 直接在类内声明友元即可

全局函数类外实现 — 需要提前让编译器知道全局函数的存在(会略显复杂)


示例:

  1. C++
  2. #include<iostream>
  3. using namespace std;
  4. #include<string>
  5. //通过全局变量,输出 Person 信息
  6. class Person {
  7. public:
  8. Person(T1 name, T2 age)
  9. {
  10. this->Name = name;
  11. this->Age = age;
  12. }
  13. void ShowPerson();
  14. private:
  15. T1 Name;
  16. T2 Age;
  17. };

8.1全局函数类内实现

  1. C++
  2. template<class T1, class T2>
  3. class Person {
  4. //全局函数 类内实现
  5. friend void PrintPerson(Person<T1, T2> p)--->PrintPerson()是一个全局函数
  6. {
  7. cout << "Name: " << p.Name
  8. << " Age: " << p.Age << endl;
  9. }
  10. /*
  11. 使用友元类 - friend:修饰 PrintPerson() 函数,使 PrintPerson() 作为 Person 类的好朋友(即,称为 Person 的友元函数),它不是 Person 中的成员函数,但其有资格去访问 Person 类的私有属性
  12. 并且,被关键字 friend 修饰的成员函数 PrintPerson() 会变为全局函数,作用域在全局,生命周期直至程序执行结束
  13. */
  14. public:
  15. Person(T1 name, T2 age)
  16. {
  17. this->Name = name;
  18. this->Age = age;
  19. }
  20. private:
  21. T1 Name;
  22. T2 Age;
  23. };
  24. //全局函数 类内实现
  25. void test01()
  26. {
  27. Person<string, int> p("啦啦啦", 18);
  28. }

8.2friend对成员函数的影响

​ 如上述代码示例中,被关键词(友元)friend 所修饰的成员函数 PrintPerson() 是一个全局函数,同时它也被称为 Person 类的友元函数。此时,其不再是 Person 类的成员函数,但它可以访问 Person 类中的私有属性。


8.2.1C++友元全局函数与成员函数的区别

https://i-blog.csdnimg.cn/direct/44002f2660db42d4bf428e082dd468ca.png


https://i-blog.csdnimg.cn/direct/ce7a3f07e45f4920ad8d9a426e8048b4.png


https://i-blog.csdnimg.cn/direct/7ad919909c5945bbab1116d6b3bd4368.png


8.3全局函数 类外实现

  1. C++
  2. template<class T1, class T2>
  3. class Person {
  4. //全局函数类外实现
  5. friend void PrintPerson02(Person<T1, T2>);
  6. public:
  7. Person(T1 name, T2 age)
  8. {
  9. this->Name = name;
  10. this->Age = age;
  11. }
  12. void ShowPerson();
  13. private:
  14. T1 Name;
  15. T2 Age;
  16. };
  17. //全局函数类外实现 - 无需作用域 Person:: (因为 PrintPerson02() 为全局函数),不需要多此一举加作用域
  18. template<class T1, class T2>
  19. void PrintPerson02(Person<T1, T2> p)
  20. {
  21. cout << "Name: " << p.Name
  22. << " Age: " << p.Age << endl;
  23. }
  24. void test02()
  25. {
  26. Person<string, int> p("呦呦呦", 3);
  27. PrintPerson02(p);
  28. }

调用产生 --- “ 无法解析外部命令 ”

https://i-blog.csdnimg.cn/direct/15786cbd7d7849488cc5581f28634886.png


原因:

  1. C++
  2. class
  3. {
  4. //因为类内声明的函数 PrintPerson02() 是一个普通(全局)函数
  5. friend void PrintPerson02(Person<T1, T2>);
  6. }

  1. C++
  2. //而类外实现的 PrintPerson02 是一个函数模板的实现
  3. template<class T1, class T2>
  4. void PrintPerson02(Person<T1, T2> p)
  5. {
  6. cout << "Name: " << p.Name << " Age: " << p.Age << endl;
  7. }

因此,这就导致了,两个 PrintPerson02 都不是一个东西


解决方法:为友元函数,增加一个空模板参数列表 <>

  1. C++
  2. class
  3. {
  4. friend void PrintPerson02<>(Person<T1, T2>);
  5. }

https://i-blog.csdnimg.cn/direct/7f32edbeacb24ceebf755bf60450c565.png


但仍需注意些许细节:如果想要全局函数(友元函数)在类外实现,还需让编译器得知友元函数的存在

将全局函数实现在 Person 类之前

https://i-blog.csdnimg.cn/direct/6a3b74144948417fa679204dfb15864c.png


https://i-blog.csdnimg.cn/direct/d15c0560e57a49b6aafcd9dcc626ad6e.png

但仍需注意:函数模板中的 Person 类模板,编译器也无法得知它的存在,因此,也许对类模板提前进行声明

  1. C++
  2. //提前声明 友元函数 PrintPerson02
  3. template<class T1, class T2>
  4. void PrintPerson02(Person<T1, T2> p)--->但友元函数的实现中,需要提供类模板 Person
  5. {
  6. cout << "Name: " << p.Name << " Age: " << p.Age << endl;
  7. }

  1. C++
  2. //因此,也需在 友元函数前,声明 类模板 Person
  3. template<class T1, class T2>
  4. class Person;
  5. template<class T1, class T2>
  6. void PrintPerson02(Person<T1, T2> p)
  7. {
  8. cout << "Name: " << p.Name
  9. << " Age: " << p.Age << endl;
  10. }
  11. template<class T1, class T2>
  12. class Person {
  13. //全局函数类外实现
  14. friend void PrintPerson02<>(Person<T1, T2>);
  15. public:
  16. Person(T1 name, T2 age)
  17. {
  18. this->Name = name;
  19. this->Age = age;
  20. }
  21. private:
  22. T1 Name;
  23. T2 Age;
  24. };
  25. void test02()
  26. {
  27. Person<string, int> p("呦呦呦", 3);
  28. PrintPerson02(p);
  29. }

https://i-blog.csdnimg.cn/direct/81e2654911a64d49a967ecccfd5ca2a7.png


文章来源: https://blog.csdn.net/2401_87692970/article/details/147256046
版权声明: 本文为博主原创文章,遵循CC 4.0 BY-SA 知识共享协议,转载请附上原文出处链接和本声明。


...全文
给本帖投票
34 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的组件模型——COM 1.2 COM的发展历程 1.2.1 COM以前的对象技术:DDE、OLE 1、VBX控件 1.2.2 COM首次亮相:OLE2 1.2.3 Microsoft拥抱Internet:ActiveX 1.2.4 更多的新名词:Windows DNA和COM+ 1.2.5 远程对象:ORBs和DCOM 1.2.6 COM的最新版本:COM+ 1.3 COM技术现状 1.3.1 COM与CORBA 1.3.2 COM与Enterprise Java Beans 1.3.3 Windows之外的COM 小结 第2章 从C++到COM 2.1 C++客户重用C++对象——例程DB 2.1.1 C++对象 2.1.2 客户程序 2.2 将C++对象移进DLL中——例程DB_cppdll 2.2.1 成员函数的引出 2.2.2 内存分配 2.2.3 Unicode/ASCII兼容 2.2.4 例程实现 2.2.4.1 修改接口文件 2.2.4.2 修改对象程序 2.2.4.3 修改客户程序 2.3 C++对象使用抽象基类——例程DB_vtbl 2.3.1 问题:私有数据成员被暴露 2.3.2 解决方案:抽象基类 2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM库装载C++对象——例程dbalmostcom 2.4.1 COM库 2.4.2 对象创建的标准入口点 2.4.3 标准对象创建API 2.4.4 标准对象注册 2.4.5 例程实现 2.4.5.1 修改接口文件 2.4.5.2 修改对象程序 2.4.5.3 修改客户程序 2.5 将C++对象变成COM对象 2.5.1 引用计数 2.5.2 多接口 2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 2.6.1 多接口 2.6.2 DEFINE_GUID 2.6.3 例程实现 2.6.3.1 修改接口文件 2.6.3.2 修改对象程序 2.6.3.3 修改客户程序 小结 第3章 COM基础知识 3.1 对象与接口 3.1.1 COM对象 3.1.2 COM接口 3.1.3 IUnknown接口 3.1.3.1 生存期控制:AddRef和Release 3.1.3.2 接口查询:QueryInterface 3.1.4 全球唯一标识符GUID 3.1.5 COM接口定义 3.1.6 接口描述语言IDL 3.2 COM应用模型 3.2.1 客户/服务器模型 3.2.2 进程内组件 3.2.3 进程外组件 3.2.4 COM库 3.2.5 HRESULT返回值 3.2.6 COM与注册表 3.3 COM组件 3.3.1 实现类厂对象 3.3.2 类厂对象的创建 3.3.3 实现自动注册 3.3.4 实现自动卸载 3.4 COM客户 3.4.1 COM对象创建函数 3.4.1.1 CoGetClassObject 3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 COM扩展技术 4.1 可连接对象机制 4.1.1 客户、接收器与可连接对象 4.1.1.1 接收器 4.1.1.2 可连接对象 4.1.1.3 客户 4.1.2 实现可连接对象 4.1.3 实现接收器 4.1.4 建立接收器与连接点的连接 4.1.5 获得出接口的类型信息 4.2 结构化存储 4.2.1 什么叫结构化存储和复合文件 4.2.2 存储对象和IStorage接口 4.2.2.1 IStorage接口 4.2.2.2 获得IStorage指针 4.2.2.3 释放STATSTG内存 4.2.2.4 枚举存储对象中的元

5,121

社区成员

发帖
与我相关
我的任务
社区描述
微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。
windowsmicrosoft 企业社区
社区管理员
  • 山月照空舟
  • 郑子铭
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。

予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部