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模块中被捕获,那么这个异常值的类型不需要在异常说明中列出。而
如果在函数定义包含了另一个函数的调用而在被调用的函数中可能会抛出一个没有被其捕获的异常值,那么该异常值
的类型就应该在异常说明中说明。
本文介绍了C++中虚函数表的工作原理,展示了如何通过指针访问虚函数表。同时,讨论了模板的布局策略,确保模板定义在使用前可用。此外,详细阐述了异常处理机制,包括多重捕获和异常说明的使用规则。
2万+

被折叠的 条评论
为什么被折叠?



