gpt4 book ai didi

c++ - 在父函数中获取子对象的大小

转载 作者:行者123 更新时间:2023-11-28 01:38:02 24 4
gpt4 key购买 nike

我想知道父函数中派生类对象的大小。在我的例子中,父函数是虚拟的,因此我不能使用 sizeof(child class name),我必须根据传递的对象动态决定。下面是代码片段。我在父类的 PrintBalance() 中使用了 sizeof(*this),但它不起作用。我需要类似的东西。我从重写的子类中显式调用父类函数。

class Account
{
protected:
int var1;
int var2;
double m_balance;

public:

Account( double d )
{

m_balance = d;
}

virtual double GetBalance()
{
return m_balance;
}
virtual void PrintBalance()
{
cout<<"size in Parent= "<< sizeof(*this)<<endl;
}
private:

};

class CurrentAccount : public Account
{
int var3;
int var4;
public:
CurrentAccount(double d) : Account(d) {}

void PrintBalance()
{
Account::PrintBalance();
cout<<"size in Derived = "<< sizeof(*this)<<endl;
cout << "Current account balance: " << GetBalance() << endl;
}
};

int main()
{
CurrentAccount cAcc(1000);
CurrentAccount *pCurrent = &cAcc ;
pCurrent->PrintBalance();
pCurrent->GetBalance();
}

最佳答案

您需要在基类中使用虚方法并在返回类/类型大小的所有派生类中覆盖它。

class Account
{
public:
//....
virtual size_t GetSizeOf() const
{
return sizeof(*this);
}
//....
virtual void PrintBalance()
{
std::cout << "size in Parent= " << this->GetSizeOf() << std::endl;
}
//...
};

class CurrentAccount : public Account
{
public:
//...
size_t GetSizeOf() const override
{
return sizeof(*this);
}
//...
void PrintBalance() override
{
Account::PrintBalance();
std::cout << "size in Derived = " << this->GetSizeOf() << std::endl;
// ...
}
};

所以它应该从两种方法打印相同的尺寸 - http://coliru.stacked-crooked.com/a/37177e4e6e899090 .


更新

要从基类打印所有派生类的成员,您需要一个允许派生类扩展基类的虚方法。

示例 1:使用覆盖打印派生类的成员:

class Account
{
protected:
//....
virtual void DoPrint() const
{
std::cout << "print Account's members" << std::endl;
}
public:
//....
void PrintBalance()
{
//std::cout << "size in Parent= " << this->GetSizeOf() << std::endl;
DoPrint();
}
};

class CurrentAccount : public Account
{
protected:
//...
void DoPrint() const override
{
Account::DoPrint();
std::cout << "print CurrentAccount's members" << std::endl;
}
};

您还可以更改基础以使用字典甚至打印回调列表。

示例 2: 打印派生类的成员而不覆盖:(http://coliru.stacked-crooked.com/a/56402cff02a922d2):

#include <functional>
#include <vector>
#include <iostream>

// not using namespace std;

class Account
{
protected:
int var1 = 1;
int var2 = 2;
double m_balance = 3.0;
public:
std::vector<std::function<void()>> printers; // Could be made static and pass `this` and as parameter

Account()
{
printers.emplace_back([this]() {
std::cout << "var1= "<< var1 << "\n"
<< "var2= "<< var2 << "\n"
<< "m_balance= "<< m_balance << std::endl;
});
}
//....
void PrintBalance()
{
for ( const auto& p : printers )
{
p();
}
}
//...
};

class CurrentAccount : public Account
{
protected:
int var3 = 4;
int var4 = 5;
public:
CurrentAccount(): Account() {
printers.emplace_back([this]() {
std::cout << "var3= "<< var3 << "\n"
<< "var4= "<< var4 << std::endl;
});
}
//...
};

关于c++ - 在父函数中获取子对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48446682/

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