虚基类多态的调试
来源:互联网 发布:java 邮件发送附件 编辑:程序博客网 时间:2024/05/16 10:53
//**************by er lei2009-10-16********************//
声明两个类:
class Base
{
public:
Base()
{
cout<<"Base Init/n";
}
virtual ~Base()
{
cout<<"Base ~~/n";
}
void DoSome()
{
cout<<"Base DoSom/n";
}
};
class Derived : public Base
{
public:
Derived()
{
cout<<"Derived Init /n";
}
virtual ~Derived()
{
cout<<"Derived ~~/n";
}
void DoSome()
{
cout<<"Derived DoSome /n";
}
};
int main(int argc, char* argv[])
{
// Derived * d = new Base();这样写是错误的 因为基类不包含全部子类成员所以不能用基类初始化
Base * d = new Derived(); //这样写是对的 在new Derived的过程中调用了d的构造函数
while (1)
{}
}
程序输出如下:
Base Init
Derived Init
main函数修改一下
int main(int argc, char* argv[])
{
Base * d = new Derived(); //用子类初始化父类
d->DoSome(); //调用的是父类的函数
delete d;
while (1)
{}
}
程序输出如下:
Base Init 初始化子类
Derived Init 初始化父类
Base DoSom 调用父类函数
Derived ~~ 调用子类析构函数
Base ~~ 调用父类析构函数
现在我们把基类和子类该一下
把子类的析构函数的virtual去掉
class Base
{
public:
Base()
{
cout<<"Base Init/n";
}
~Base()
{
cout<<"Base ~~/n";
}
void DoSome()
{
cout<<"Base DoSom/n";
}
};
class Derived : public Base
{
public:
Derived()
{
cout<<"Derived Init /n";
}
~Derived()
{
cout<<"Derived ~~/n";
}
void DoSome()
{
cout<<"Derived DoSome /n";
}
};
int main(int argc, char* argv[])
{
Base * d = new Derived();
d->DoSome(); //调用的是基类的函数
delete d; //只调用基类的析构函数
while (1)
{}
}
输出如下:
Base Init
Derived Init
Base DoSom
Base ~~
再改一下程序:析构和DoSome函数都加上virtual
class Base
{
public:
Base()
{
cout<<"Base Init/n";
}
virtual ~Base()
{
cout<<"Base ~~/n";
}
virtual void DoSome()
{
cout<<"Base DoSom/n";
}
};
class Derived : public Base
{
public:
Derived()
{
cout<<"Derived Init /n";
}
~Derived()
{
cout<<"Derived ~~/n";
}
void DoSome()
{
cout<<"Derived DoSome /n";
}
};
int main(int argc, char* argv[])
{
Base * d = new Derived();
d->DoSome();
delete d;
while (1)
{}
}
程序输出如下
Base Init
Derived Init
Derived DoSome 子类的函数
Derived ~~
Base ~~
咱么现在来总结一下:
在基类用子类构造的前提下
若基类的DoSome是虚函数
则调用子类的DoSome函数
若基类的DoSome不是虚函数
则调用基类的DoSome函数
简单来说就是这么个规律,但是为什么呢,咱么来点有深度的
编译器在编译一个有虚函数的类时会为此类生成一个虚拟函数表vtable
表的值就是指向虚函数地址的指针
在调用类的构造函数时,指向基础类的指针此时已经变成指向具体的类的this指针,这样依靠此this指针即可得到正确的vtable,从而实现了多态性。在此时才能真正与函数体进行连接,这就是动态联编。
- 虚基类多态的调试
- 调试LATTICE 的SGMII的调试。
- 调试的时候,调试页面的配置
- 调试代码(1) -- 调试原则与调试常用的方法
- 遇到调试器不能调试的问题
- 调试--几种调试php的方法
- GDB调试及其调试脚本的使用
- 《软件调试》-- 编译器的调试支持
- GDB调试及其调试脚本的使用
- ocx的容器调试和ie调试
- SEH反调试的实现与调试
- 调试案例明白断点调试的重要性
- GDB调试及其调试脚本的使用
- 记录:usb_hid的调试过程 (调试完毕)
- 驱动程序的调试(windbg双机调试)
- DLL的调试
- 关于javascript的调试
- 嵌入式操作系统的调试
- java时区解决方案
- 青海之行
- ITK 数据源
- 多好的文字啊
- dfgd
- 虚基类多态的调试
- python初学-资源
- 窗体分割与合并算法的研究与实现
- 让random在极短时间内产生的随机数不相同
- flex 问题总结
- matlab绘图-- 计算可视化
- Delphi7下实现Panel透明化!
- 日常交际礼仪一、社交场合中的礼仪
- 开始linux应掌握的实用命令