gpt4 book ai didi

c++ - 虚拟类的非虚拟版本

转载 作者:太空狗 更新时间:2023-10-29 21:06:32 24 4
gpt4 key购买 nike

假设我们有以下两个类定义。

#include <iostream>
#include <array>

class A
{
public:
virtual void f() = 0;
};

class B : public A
{
public:
virtual void f() { std::cout << i << std::endl; }
int i;
};

在这里sizeof(B) == 8 ,大概是 4 个虚拟指针和 4 个代表 int .

现在假设我们创建了一个 B 数组,如下所示:

std::array<B, 10> x;

现在我们得到 sizeof(x) == 80 .

如果我的理解是正确的,所有方法都调用x 的元素。静态解析,因为我们在编译时知道类型。除非我们做类似 A* p = &x[i] 的事情我认为甚至不需要存储虚拟指针。

如果您知道不会使用 B 类型的对象,是否有一种方法可以在不使用虚拟指针的情况下创建它?

即模板类型 nonvirtual<T>它不包含虚拟指针,并且不能被 T 的子类型指向?

最佳答案

Is there a way to create an object of type B without a virtual pointer if you know it is not going to be used?

没有。对象就是它们。虚拟对象始终是虚拟的。

毕竟,您可以这样做:

A *a = &x[2];
a->f();

那是完全合法的合法代码。而 C++ 必须允许它。 B 类型是虚拟的,它有一定的大小。您不能根据使用位置使类型成为不同的类型。

关于c++ - 虚拟类的非虚拟版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7550171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com