C++ 下 P13
三个主题
variadic templates (C++ 11)
auto
ranged-base (C++ 11)
reference
加上 const 后 函数签名不同 可以共存
P17 关于vptr 和 vtbl
子类中有父类 的part 成分 .
当一个类中有虚函数 对象中大小会多一个指针
class A {
public:
virtual void fun()
{
}
private:
int x;
int y;
};
class B{
public:
void fun()
{
}
private:
int x;
int y;
};
int main()
{
A a;
B b;
cout << "A" << sizeof(a) << endl; // 12
cout << "B" << sizeof(b) << endl; //8
return 0;
}
虚函数指针 -> 虚函数表 虚函数表中地址指向虚函数
一共四个虚函数 ,四个成员函数
A 中 两个虚函数 一个黄色代表独有的
B 中 两个虚函数 浅蓝色 表示 重写的A 中的 黄色
深蓝色 代表继承了 A 中的 vfun2 函数
C 中 两个虚函数 重写 vfun1
浅黄色代表自己独有的虚函数
静态绑定 调用 call xx
动态绑定 条件 1 通过指针调用 ,2 指针向上转型 比如 new C 但是指针声明的时候 声明的时候是 A .3调用的是虚函数
符合 这三个条件 则成为 动态绑定
具体调用 需要看 p 的指向
多态 虚函数 动态绑定
2020/6/29
虚函数 实现多态的主要途径
子类对象调用 父类的虚函数 执行到 serialize 时候 跳到 子类对象 ,这是因为动态绑定 this指针指向的是子类对象(谁掉用谁就是this).c++中 成员函数都有 this 这个参数 .
然后调用 this->Seriallize()
编译器 编译成 (*(this->vptr)[n] )(this) ; this 指向子类 所以调用子列的虚函数 ,而不是父类的虚函数
// 非虚函数 定义的对象是啥类型 就调用那个类型函数 看 定义的对象指向谁比如
//A 就调用A 中成员函数
// 虚函数 看具体的对象绑定的是子类 还是父类就是new 的对象指向
class A {
public:
virtual void fun1()
{
cout << "Afun1\n";
}
void fun2()
{
cout << "Afun2\n";
}
};
class B: public A{
public:
virtual void fun1()
{
cout << "Bfun1\n";
}
void fun2()
{
cout << "Bfun2\n";
}
};
int main()
{
A a;
a.fun1(); //A
B b;
b.fun1(); // B
A* ptr = new B;
// 非虚函数 定义的对象是啥类型 就调用那个类型函数 看 定义的对象指向谁比如
//A 就调用A 中成员函数
// 虚函数 看具体的对象绑定的是子类 还是父类就是new 的对象指向谁
ptr->fun1(); //B
ptr->fun2(); // A
}
}
P20 动态绑定
对象调用成员函数 ,对象是那个类 就调用 那个类的成员函数 ,是静态绑定 比如 图片中 虽然定义为 B 经过强转之后 为A类型
但是 是静态绑定 所以调用的是 A 的虚函数
动态绑定 必须符合三个条件
1 通过指针调用
2 虚函数
3 向上转形
pa 符合三个条件 所以是动态绑定 call dw…
const 对象 调用非常量成员函数 编译器会报错.
no-const 都可以调用 成员函数 没有const 和 no -const 区分