Aqu*_*irl 0 c++ virtual function
class classWithNoVirtualFunction
{
public:
int a;
void x ()
{
char c;
c = 'a';
}
};
class classWithOneVirtualFunction
{
public:
int a;
virtual void x () {}
};
class classWithTwoVirtualFunctions
{
public:
int a;
virtual void x () {}
virtual void y () {}
};
int main()
{
cout << "\nclassWithNoVirtualFunction's size: " << sizeof (classWithNoVirtualFunction);
cout << "\nclassWithOneVirtualFunction's size: " << sizeof (classWithOneVirtualFunction);
cout << "\nclassWithTwoVirtualFunctions's size: " << sizeof (classWithTwoVirtualFunctions);
cout << "\nvoid*'s size : " << sizeof (void*);
}
Run Code Online (Sandbox Code Playgroud)
WRT上面的代码,Thinking in C++说:
此示例至少需要一个数据成员.如果没有数据成员,则C++编译器会强制对象为非零大小,因为每个对象必须具有不同的地址.如果你想象索引到一个零大小的对象数组,你会明白.将"虚拟"成员插入到否则将为零大小的对象中.
我的问题:现在,如果我们有一个零成员和虚函数的类,我无法理解什么&&如何发生.请解释一些编程示例.
只要类包含至少一个虚函数,编译器就需要向每个对象添加RunTime Type Information.该实现通常会添加一个指向每个对象的指针,该指针引用由编译器定义并对用户隐藏的结构,其中包含指向type_info对象的指针以及vtable用于动态分派函数的指针.
在没有非静态数据成员和至少一个虚拟函数的类的情况下,每个对象的大小是的每个对象的RTTI信息(一个指针)的大小,并且因为这是非零,编译器不会增加额外的空间.引用的内容是,sizeof(T) != 0对于任何和所有类型T,具有动态功能的类型通常符合该要求.只有大小为零的类型,编译器才会强制使对象1 char大.
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |