面向对象程序设计-C++_课时24多态的实现

所有带virtual的类的对象,里面最上面有一个隐藏的指针vptr,指向一张表vtable

 1 #include <iostream>
 2 using namespace std;
 3
 4 class A
 5 {
 6 public:
 7     A() :i(10) {}
 8     virtual void f() { std::cout << "A::f()" << std::endl; }
 9     int i;
10 };
11
12 void main()
13 {
14     A a, b;
15     a.f();
16
17     std::cout << sizeof(a) << std::endl;//8,不是4
18
19     int *p = (int *)&a;
20     int *q = (int *)&b;
21
22     int *x = (int *)*p;
23
24     std::cout << *x << std::endl;
25
26     std::cout << *p << " " << *q << std::endl;//一样
27
28     system("pause");
29 }

1234

时间: 2024-10-12 12:53:08

面向对象程序设计-C++_课时24多态的实现的相关文章

面向对象程序设计-C++_课时30运算符重载——基本规则_课时31运算符重载——原型_课时32运算符重载——赋值_课时33运算符重载——类型转换

区分初始化,赋值 1 #include <iostream> 2 using namespace std; 3 4 class Fi 5 { 6 public: 7 Fi() {}//1构造函数 8 }; 9 10 class Fee 11 { 12 public: 13 Fee(int) {}//2构造函数 14 Fee(const Fi&) {}//3构造函数 15 }; 16 17 void main() 18 { 19 Fee fee = 1;//2构造函数 20 Fi fi;

面向对象程序设计-C++_课时16子类父类关系

初始化列表 类名::类名(形参1,形参2,...形参n):数据成员1(形参1),数据成员2(形参2),...,数据成员n(形参n) { ... } 规则1,初始化列表进行数据成员的初始化 规则2,初始化列表进行父类的初始化 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 private: 7 int i; 8 public: 9 A(int ii) :i(ii)//初始化列表 10 { 11 std::cout &l

面向对象程序设计-C++_课时26拷贝构造Ⅰ_课时27拷贝构造Ⅱ

复制构造函数,不是字节对字节的拷贝,而是成员对成员的拷贝 构造函数,参数是引用一个类 正确 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 static int objectCount = 0; 6 7 class HowMany 8 { 9 public: 10 HowMany() { objectCount++; print("HowMany()"); }//构造函数,

面向对象程序设计-C++_课时19const_课时20不可修改的

error C2131: 表达式的计算结果不是常数 1 #include <iostream> 2 using namespace std; 3 4 void main() 5 { 6 const int class_size = 12; 7 int finalGrade[class_size]; 8 9 int a = 12; 10 int arr[a];//error C2131: 表达式的计算结果不是常数 11 12 int x; 13 std::cin >> x; 14 c

面向对象程序设计-C++_课时21引用

数据类型 & 别名=对象名; 1 #include <iostream> 2 using namespace std; 3 4 int * f(int * x) 5 { 6 (*x)++; 7 return x; 8 } 9 10 int & g(int & x) 11 { 12 x++; 13 return x; 14 } 15 16 int x; 17 18 int & h() 19 { 20 int q;//!return q 21 return x; 2

面向对象程序设计-C++_课时22向上造型

赋值兼容规则是指在公有派生情况下,一个派生类的对象可以作为基类的对象来使用的情况. 约定类derived是从类base公有派生而来的,则指如下3种情况: (1)派生的对象可以赋给基类的对象.例如: derived d; base b; b=d; (2)派生类的对象可以初始化基类的引用.例如: derived d; base& br=d; (3)派生类的对象的地址可以赋给指向基类的指针.例如: derived d; base *pb=&d; 把子类的对象交给父类的指针或引用就成了向上造型.

面向对象程序设计-C++_课时13初始化列表

尽量在Initialization初始化,不要在assignment构造函数赋值 1 Student::Student(string s) :name(s) 2 { 3 4 }

面向对象程序设计-C++_课时18内联函数

使用inline说明的函数称内联函数. 在C++中,除具有循环语句.switch语句的函数不能说明为内联函数外,其他函数都可以说明为内联函数. 1 #include <iostream> 2 using namespace std; 3 4 inline int f(int i) 5 { 6 return i * 2; 7 } 8 9 void main() 10 { 11 int a(4); 12 int b = f(a); 13 14 std::cout << a <&l

面向对象程序设计-C++_课时17函数重载和默认参数

函数重载,区别一是参数类型不同,二是参数个数不同. 默认参数可以多于1个,但必须放在参数序列的后部. 尽量不要用默认参数,会影响阅读 error C2668: “f”: 对重载函数的调用不明确 1 #include <iostream> 2 using namespace std; 3 4 void f(int i, int j = 0)//默认参数 5 { 6 std::cout << i << " " << j << st