-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmain.cpp
66 lines (49 loc) · 1.63 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "Derived.h"
// void func1(Base x) {}
// Это не скомпилируется потому что Base это не тип и не класс, а шаблон.
// error: variable or field ‘func’ declared void
// Не может определить типа Base, считает что это unknown type.
// error: missing template arguments before ‘x’
// К томе же принимая экземпляр Base по значению происходит object slicing.
// Нужно передавать по ссылке или по указателю.
void func1(Base<Derived>& x) {
x.implementation();
}
void func2(Derived x) {
x.implementation();
}
template<class T>
void func3(T x) {
x.implementation();
}
// Эта функция может быть вызвана с любым типом произведенным от Base.
// И она использует статический тип того, что ей передано в параметре
// чтобы решить какую функцию вызвать.
template <typename T>
void func4(Base<T>& x) {
x.implementation();
}
int main(int argc, char* argv[]) {
Derived d;
std::cout << "№ 1\n";
func1(d);
// OUTPUT:
// implementation()
// Derived::implementation()
std::cout << "№ 2\n";
func2(d);
// OUTPUT: Derived::implementation()
std::cout << "№ 3\n";
func3(d);
// OUTPUT: Derived::implementation()
std::cout << "№ 4\n";
func4(d);
// OUTPUT:
// implementation()
// Derived::implementation()
std::cout << "№ 5\n";
Derived::static_func();
// OUTPUT:
// Derived::static_sub_func()
return 0;
}