Absolute C++心得(续3)

本文介绍了C++中虚函数表的工作原理,展示了如何通过指针访问虚函数表。同时,讨论了模板的布局策略,确保模板定义在使用前可用。此外,详细阐述了异常处理机制,包括多重捕获和异常说明的使用规则。
31、任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法。例如:
class Base
{
virtual void f();
virtual void g();
};
class Derived : public Base
{
virtual void f();
virtual void g1();
};
Base *base = new Derived();

base->g1();//这样的行为是违法的

32、若一个类包含一个或者多个的虚函数,则会为该类分配一个虚函数表的指针,即会多出一个指针大小的空间。
C++的编译器会把虚函数表的指针存于对象实例的最前面的位置。我们可以指针遍历其中的函数指针。例如:
class Base
{
public:
virtual void f();
virtual void g();
virtual void h();
};
typede void (*Func)(void);
Base b;
(Func)*((int *)*(int *)(&b) + 0);//Base::f()
(Func)*((int *)*(int *)(&b) + 1);//Base::g()
(Func)*((int *)*(int *)(&b) + 2);//Base::h()

33、能保证在绝大多数的C++的编译器上对模板程序编译成功的布局:将模板的定义和使用模板的程序放在一个文件中,并且
保证模板的定义出现在所有使用模板的代码之前。如果你想将函数模板的定义放在一个与你的应用程序不同的单独文件中,可
以用#include命令在需要使用该模板的文件中将函数模板的定义包含进来。

34、多重抛出和捕获异常,catch的参数是与throw抛出的类型是一致的。
catch(...)
{
}
上面代码中的三个圆点并不是省略号,而是实际程序中键入的三个圆点。这是一个可以放在所有其它的catch模块后面
的非常好的默认catch模块。

35、在函数的定义中有多个可能的异常被抛出,那么这些异常类型之间应该用逗号隔开,如下所示:
void someFunction() throw(int,SomeOtherException);
在异常说明中列出的所有异常类型都会得到正常的处理。如果一个函数抛出了异常值,而此值没有在异常说明中列出,
则此时unexcepted()会被调用,默认的是终止程序。

请牢记异常说明是为说明那些在函数外面捕获的异常值。如果这些异常不需要在函数外部捕获,则不需要在异常说明
中列出;对于那些需要在外部捕获的异常值,无论在何处产生,都应该在异常说明中列出。如果某个异常值在函数定义
中的try模块被抛出,然后在该函数定义中的catch模块中被捕获,那么这个异常值的类型不需要在异常说明中列出。而
如果在函数定义包含了另一个函数的调用而在被调用的函数中可能会抛出一个没有被其捕获的异常值,那么该异常值
的类型就应该在异常说明中说明。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值