C ++继承:如何获取被调用对象的大小?

时间:2013-12-06 08:44:53

标签: c++ inheritance

首先,我是初学者,但对编码非常热心。

我有这个基类,从中继承了几个类。函数用基类编写,需要被调用对象的大小。在编写函数时,大小是未知的,因为函数可以由不同派生类的对象调用。 到目前为止,我一直把这个大小作为一个论点,但应该有所改变。

我尝试了sizeof(* this),但sizeof(* this)返回一个完全不同的值,既不是基类的大小,也不是派生类的大小。我很困惑....任何解释?

3 个答案:

答案 0 :(得分:3)

您可以编写一个将返回对象大小的虚函数

struct Base
{
    virtual size_t size() const { return sizeof( *this ); }
    virtual ~Base(){}
};

struct Derived1 : Base
{
    virtual size_t size() const { return sizeof( *this ); }
    int x;
};

struct Derived2 : Base
{
    virtual size_t size() const { return sizeof( *this ); }
    int x;
    int y;
};

Base *b  = new Base;
Base *b1 = new Derived1;
Base *b2 = new Derived2;

std::cout << "b->size() = " << b->size() << std::endl;
std::cout << "b1->size() = " << b1->size() << std::endl;
std::cout << "b2->size() = " << b2->size() << std::endl;

答案 1 :(得分:0)

只需使用sizeof()运算符和classname即可。你可以找到任何类的大小。

size = sizeof(ClassName);

答案 2 :(得分:0)

好的,我会尝试回答。

根据这个链接: sizeof *this object

sizeof在编译时计算,因此您的函数将始终使用Base对象的大小(除非您的函数在子类中被覆盖)。

所以最好的解决方案是使用模板。 正如Damon在评论中指出的那样,奇怪的重复出现的模板模式就是这里的解决方案:

template <class ActualClass>
class Base
{
  size_t mySize() const { return sizeof(ActualClass); }
}

class Derived : public Base<Derived>
{
};

编辑:这有缺点,你的公共基类实际上是每个派生的不同类。