C++ 获取父函数内子对象的大小

C++ 获取父函数内子对象的大小,c++,c++11,C++,C++11,我想知道父函数中派生类对象的大小。在我的例子中,父函数是虚拟的,因此我不能使用sizeof(子类名),我必须根据传递的对象动态决定。下面是代码片段。我在父类的PrintBalance()中使用了sizeof(*this),这将不起作用。我需要类似的东西。我从重写的子类显式调用父类函数 class Account { protected: int var1; int var2; double m_balance; public: Account( dou

我想知道父函数中派生类对象的大小。在我的例子中,父函数是虚拟的,因此我不能使用sizeof(子类名),我必须根据传递的对象动态决定。下面是代码片段。我在父类的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();
}
类帐户
{
受保护的:
int-var1;
int-var2;
双m_平衡;
公众:
账户(双d)
{
m_平衡=d;
}
虚拟双GetBalance()
{
返回m_余额;
}
虚拟空打印余额()
{

cout在基类中需要一个虚方法,并在返回类/类型大小的所有派生类中重写它

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;
        // ...
    }
};
类帐户
{
公众:
//....
虚拟大小\u t GetSizeOf()常量
{
返回sizeof(*此);
}
//....
虚拟空打印余额()
{

std::cout在基类中需要一个虚方法,并在返回类/类型大小的所有派生类中重写它

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;
        // ...
    }
};
类帐户
{
公众:
//....
虚拟大小\u t GetSizeOf()常量
{
返回sizeof(*此);
}
//....
虚拟空打印余额()
{

对我来说,cout看起来像是一个严重的设计缺陷。为什么你真的需要知道尺寸?是的,我也认为这可能是一个设计问题。但是在改变我的设计之前,我想问一下这个论坛是否有其他选择。再说一次:为什么你认为你需要知道尺寸?我想去寻找打印和打印的通用功能这就是为什么我把打印功能放在父类中。我可能要去单独的类进行打印,并使之成为朋友。我猜(我只是理解C++的概念,不能立即决定)。=0;
对我来说似乎是一个严重的设计缺陷。为什么你真的需要知道尺寸?是的,我也认为这可能是一个设计问题。但我想在更改我的设计之前,向本论坛询问其他选择。再说一次:为什么你认为你需要知道尺寸?我想使用常见的打印和打印功能这就是为什么我把打印功能放在父类中。也许我必须去单独的类进行打印并使之成为朋友。我猜(我只是理解C++的概念,不能立即决定)。=0;
您的回答对我帮助很大。同样,我如何获得对子类对象的引用,以便可以打印父类中的任何子对象数据(使用覆盖)?由于C++11中不允许自动键入,除非我选择C++14,否则这可能吗?您无法知道派生类(将)的数据有。因此,您需要额外的虚拟方法,每个子级必须重写并打印其自己的成员。一个选项是使用基类中带有变量的字典,他们可以将其字段添加到该字典中。这是只在父级中打印而不在派生类中执行某些操作的唯一方法。您的回答对我帮助很大.同样,我如何获得对子类对象的引用,以便可以打印父类中的任何子对象数据(使用覆盖)?由于C++11中不允许自动键入,除非我选择C++14,否则这是否可能?您无法知道派生类(将)的数据因此,您需要额外的虚拟方法,每个子级都必须重写并打印其自己的成员。一个选项可以是在基类中使用带有变量的字典,并且它们可以将其字段添加到该字典中。这是仅在父级中打印而不在派生类中执行某些操作的唯一方法。
#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;
        });
    }
    //...
};