Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
派生类是否可以比其父类小? 我问C++,因为我熟悉这个问题,但是这个问题真的解释了:有没有一种语言,我们可以从中派生出一个类,使它在记忆中占据的空间比原来的类少?_C++_Inheritance_Derived Class_Memory Efficient - Fatal编程技术网

派生类是否可以比其父类小? 我问C++,因为我熟悉这个问题,但是这个问题真的解释了:有没有一种语言,我们可以从中派生出一个类,使它在记忆中占据的空间比原来的类少?

派生类是否可以比其父类小? 我问C++,因为我熟悉这个问题,但是这个问题真的解释了:有没有一种语言,我们可以从中派生出一个类,使它在记忆中占据的空间比原来的类少?,c++,inheritance,derived-class,memory-efficient,C++,Inheritance,Derived Class,Memory Efficient,这个问题与其说是我试图解决的实际问题,不如说是一个噱头,但我可以想象一些真正高性能的代码可以从这种内存优化中获益: 假设我们有: class Person { std::string name; unsigned int age; } class PersonNamedJared { } 理论上,我们在这个子类中不需要字段“name”,因为它总是“Jared”,这可以提高内存效率 只有将Person中的“name”字段替换为get_name()函数,我们才可以在PersonN

这个问题与其说是我试图解决的实际问题,不如说是一个噱头,但我可以想象一些真正高性能的代码可以从这种内存优化中获益:

假设我们有:

class Person {
    std::string name;
    unsigned int age;
}

class PersonNamedJared {
}
理论上,我们在这个子类中不需要字段“name”,因为它总是“Jared”,这可以提高内存效率

只有将
Person
中的“name”字段替换为
get_name()
函数,我们才可以在
PersonNamedJared
中重写该函数,以始终返回“Jared”,这是实现此目的的唯一方法吗?我们如何在基类中仍然使用name变量

我知道这个例子很糟糕,但这是我能想到的最好的例子。我认为实施这种模式是有正当理由的

派生类是否可以比其父类小

否。派生类始终包含基类子对象。对象永远不能小于其子对象,因此派生类永远不能小于其基对象

用get_name()函数替换Person中的'name'字段是实现这一点的唯一方法吗?我们只需在PersonNamedJared中重写该函数,以始终返回“Jared”

这将是实现这一目标的一种方法

我们如何在基类中仍然使用name变量

在不希望位于派生类中的基中不能有成员变量

例如,您可以使用多重继承,以便在某些派生类中有一个带变量的基。大概是这样的:

struct Person {
    unsigned int age;
    virtual std::string name() = 0;
    ...

struct Named {
    std::string name;
};

struct NamedPerson : Person, private Named {
    std::string name() override {
        return name;
    }
};

struct JaredPerson : Person {
    std::string name() override {
        return "Jared";
    }
};
这里有一个带变量的基,但Jared不会继承该基。

从类继承意味着您包括它的所有成员变量、它的父类成员变量,以及您自己的类包含的任何变量

换句话说,子类是父类的超集。(空的子类除外)

即使私有成员仍然占用空间,尝试访问它们也只是一个编译器错误

派生类是否可以比其父类小

在C++中,不!p> 即使尝试用派生类中较小的成员替换基类的成员(使用相同的名称),基类成员仍然存在(只是更难访问)。此代码将演示,当派生类实际增加到基的大小时:

#包括
甲级{
公众:
双q[200];
};
B类:A{
公众:
双q[100];//我们可以用一个较小的数组替换基本数组吗?
};
int main()
{

Std::CUT< P>如果使用多态性,答案应该是清楚的。也就是说,利用语言特征,让你把派生类型的对象看作是一个基本类型之一。假设<>代码>人>代码>是一个公共基础:<代码>人名JavaRea/Cord>,并考虑下面的代码。
PersonNamedJared Jared;
Person * Pointer = &Jared;
std::cout << Pointer->name << " is " << Pointer->age << " years old.";
PersonNamedJared;
Person*Pointer=&Jared;

std::cout name afaik,派生类应该用来建模is-a关系,所以我想派生类至少应该和它的基一样大。可以发明这样的语言,但没有理由。总是可以将所有数据成员放在叶类中,这样就不会继承任何不需要的数据。这似乎是不必要的复杂。我刚刚创建了Person、NamedPerson和JaredPerson,没有多重继承。如果我真的想做得更好的话,我会在编译时创建一个FixedNamePerson模板,使用这个名称。PS:你真的应该在基类中有一个虚拟析构函数,并向经验较少的读者解释这是一个好主意,不,这是一个要求!复杂性是有用的还是不必要的取决于实际的用例。没有用例是不可能衡量这一点的。简单的方法在一种情况下可能更好,复杂的方法在另一种情况下可能更好。模板建议也一样,它引入了自身的复杂性。虚拟析构函数将这可能是个好主意,但在我看来,解释它超出了这个问题的范围。我选择删除右大括号并添加省略号,这样不完整的基就不会被逐字复制。实际上,Dart(由google提供)基本上允许您使用类似变量的符号运行自定义“getter”和“setter”代码(例如person.name可以调用一个只返回“Jared”的自定义getter)从这里开始,我开始问自己这是如何实现的,因为现在我知道继承只是编译器生成的组合,子类永远不能小于superclasses@AdriaanJacobs有一些语言在实际有一个函数是ca时,通过使用类似变量的表示法来模糊这条线这只是谜题的一部分。