小编ren*_*nzo的帖子

理解派生类中的vtable

我试图通过虚拟表和继承来解决一些低级别的问题.

通过继承两个类并添加新的虚函数来创建新类时,vptr将存储在哪里?

在我看来,编译器在这种情况下执行一些'vptr-optimization'.而我正想弄明白.

假设,我们有以下结构:

struct A
{
  int a;
  virtual void fa();
};
struct B
{
  double b;
  virtual void fb();
};
struct C : A, B
{
  char c;
  virtual void fa();
  virtual void fb();
  virtual void fc();
};
Run Code Online (Sandbox Code Playgroud)

在86的情况下和对齐= 4,A并且B在存储器中看起来像这样:

   +------+------+
A: | vptr |  a   |
   +------+------+
sizeof(A) = 4 + 4 = 8

   +------+------+------+------+
B: | vptr        |      b      |
   +------+------+------+------+
sizeof(B) = 8 + 8 = 16
Run Code Online (Sandbox Code Playgroud)

但是当我尝试重新组装时C,我得到了这个:

   +------+------+------+------+------+------+------+ …
Run Code Online (Sandbox Code Playgroud)

c++ oop inheritance vtable vptr

6
推荐指数
1
解决办法
506
查看次数

具有多个条件的默认模板特化

我想为整数类型、字符串和其他类型定义函数。

我可以写:

template<typename T, typename = std::enable_if<std::is_integral<T>::value>::type>
void foo();

template<typename T, typename = std::enable_if<std::is_same<std::string>::value>::type>
void foo();
Run Code Online (Sandbox Code Playgroud)

但是我如何定义在其他情况下将被调用的函数(如果T不是整数类型而不是std::string)?

c++ sfinae c++11

5
推荐指数
1
解决办法
1458
查看次数

标签 统计

c++ ×2

c++11 ×1

inheritance ×1

oop ×1

sfinae ×1

vptr ×1

vtable ×1