继承下基类的OOPS内存分配

OOPS Memory Allocation for Base class under Inheritance?

本文关键字:内存 分配 OOPS 基类 继承      更新时间:2023-10-16

程序:

class A
{
    int a;
public:
    void geta()
    {
        a=10;
    }
    void puta()
    {
        cout<<"a : "<<a;
    }
};
class B : public A
{
    int b;
public:
    void getb()
    {
        geta(); b=20;
    }
    void putb()
    {
        puta(); cout<<"b : "<<b;
    }
};
int main()
{
    B ABC;
    ABC.getb();
    ABC.putb();
    return 0;
}

问题:上面的程序为派生类对象&调用其相关方法。基类是作为公共成员继承的,由于变量"a"是私有成员,因此它不会被继承。

因此,程序不应该为这个变量分配内存。但是,当执行上述操作时,即使"a"变量不是继承的,它也会被分配。

有人能帮我理解吗?非常感谢。

由于变量"a"是私有成员,因此它不会被继承。因此,程序不应该为这个变量分配内存。

你的假设是错误的。公共继承为"is-a"关系建模。也就是说,类Derived是一个Base。使用Base可以做的任何事情,都应该能够使用Derived。为了实现这一点,它必须包含Base包含的所有内容。

在你的例子中,说是完全合法的

B b;
b.put_a();

即在B对象上使用A方法。如果a成员缺席,这将不起作用。

基类是作为公共成员继承的,由于变量"a"是私有成员,因此它不会被继承。

当基类成员被声明为private时,并不意味着它不会被继承。这只是意味着成员变量将被继承(将是派生类的一部分),但将不可访问

例如,在:中

class A {
private:
    int a;
    int b;
    // ...
};
class B : public A {};
auto main() -> int {
    B b;
}

当我们分配B b;时,我们同时分配类Aab成员对象。

变量a是继承的,尽管您无法访问它

class A {
private:
    int x;
public:
    int getXfromA() { return x; }
};
class B : public A {
public:
    int getXfromB() { return getXfromA(); }
};

但是,这里不能从B类直接访问x

您混淆了存储和访问控制。

如果对象B继承自对象A,则它具有对象A的所有方法和成员,即使它不能直接访问它们。

privateprotected的目的是访问控制。如果将成员和方法标记为私有,那么外部的任何东西都不能访问这些方法和成员。但是,这些东西仍然是物体的一部分。

这允许您在不公开细节的情况下实现类不变量,包括从基继承的类。

下面是一个示例,它封装了捕获基类中对象的创建时间:

#include <time.h>
#include <iostream>
class Base
{
    private:
        time_t create_time;
    public:
        Base()
        {
            create_time = time(0);
        }
        time_t get_create_time() { return create_time; }
};
class Derived : public Base
{
    public:
        Derived() { }
};

int main()
{
    Derived D;
    std::cout << D.get_create_time() << std::endl;
}

Derived不知道或者不需要知道创建时间是如何被捕获的。它是从Base派生而来的类不变量。

这是一个非常简单的例子,但你可以想象更复杂的例子。