-
24-09-2019 - |
题
我看了很多人写“虚表存在,有一个虚函数在它声明的类。”
我的问题是,是否一个虚函数表只存在对于具有虚拟功能或者它也存在用于从类派生的类的类。
e.g
class Base{
public:
virtual void print(){cout<<"Base Print\n";}
};
class Derived:public Base{
public:
void print(){cout<<"Derived print\n";}
};
//From main.cpp
Base* b = new Derived;
b->print();
问题:假如有一直没有虚函数表为类衍生然后输出就不会被“衍生打印”。所以IMO存在对具有虚拟功能的类虚函数表中的类从类继承声明和也。这是正确的吗?
解决方案
至于仅虚拟功能特定的功能被认为是,在传统的方法来虚表执行派生类需要的虚函数表单独版本当且仅当此派生类覆盖的至少一个虚函数。在你的榜样,Derived
覆盖虚函数print
。由于Derived
有自己print
的版本,在Derived
虚函数表中的相关条目中Base
虚函数表不同。这通常用于必要一个Derived
单独虚函数表。
如果Derived
一点都没有覆盖任何东西,正式它仍然是一个独立的多态类,而是为了让自己的虚拟功能的正常工作,我们可以简单地重复使用Base
虚函数表的Derived
为好。因此,技术上不会有任何需要用于Derived
一个单独虚表。
然而,在实际实现中,数据结构,我们通常称之为“虚函数表”,经常保持一些附加的类的特定信息,以及。这额外的信息是如此之类特定多数的就不可能在层级上不同阶层之间共享虚函数表,即使它们使用相同的一组虚函数的时间。例如,在一些实施方式中存储在各多态型对象指向数据结构,它也存储所谓的“RTTI信息”关于类V表指针。出于这个原因,在大多数(如果不是全部)实际实现每个多态性类都有自己的虚函数表,即使存储这些表中的虚拟函数指针碰巧是相同的。
其他提示
是的,你的理解是正确的。对具有基本与任何虚拟功能的任何类有一个虚表。
是的,这是真的。实际上,给定的基础的确定指标:
class derived:public base{
public:
void print(){cout<<"derived print\n";}
};
是完全等效于:
class derived:public base{
public:
virtual void print(){cout<<"derived print\n";}
};
...因为你已经定义的打印作为基础虚拟
我希望编译器将强制执行......
是的,这是事实。一个类继承它的基类的全部数据成员,包括虚表。然而,(如果类重写基类的虚方法,在V表必须指向它自己的实现中的相应条目例如)虚表条目相应的调整。
但请记住,一个“虚函数表”的概念是vitually每一个编译器使用常见的做法,但它不是强制性的,也不规范。