C++ 继承可以用来减少C++;?

C++ 继承可以用来减少C++;?,c++,c++11,inheritance,size,C++,C++11,Inheritance,Size,我正在一个基于Arduino的系统(即嵌入式系统)的项目中工作,并且有有限的ROM供代码使用 我发现自己需要几种不同类型的集合类(例如列表,堆栈,队列)。 在写了这些之后,我注意到除了使它们表现不同的特性(例如,AddvsPushvsEnqueue,PopvsDequeue)之外,它们还有许多共同的功能(例如,它们具有完全相同的字段) 这让我想到,如果我要创建一个基类,它包含其他类的所有公共功能(我们称之为Collection),并使其他类从中继承,让它们只实现不同的功能,会不会导致编译代码更少

我正在一个基于Arduino的系统(即嵌入式系统)的项目中工作,并且有有限的ROM供代码使用

我发现自己需要几种不同类型的集合类(例如
列表
堆栈
队列
)。 在写了这些之后,我注意到除了使它们表现不同的特性(例如,
Add
vs
Push
vs
Enqueue
Pop
vs
Dequeue
)之外,它们还有许多共同的功能(例如,它们具有完全相同的字段)

这让我想到,如果我要创建一个基类,它包含其他类的所有公共功能(我们称之为
Collection
),并使其他类从中继承,让它们只实现不同的功能,会不会导致编译代码更少

我希望会这样,因为子类都可以引用父类对公共函数的实现,但我可能错了,所以我宁愿在尝试此更改之前询问


OK,为了进一步澄清这一点,因为人们似乎误解了,假设这些假设的类:

class A
{
protected:
    int value;
public:
    void assign(int other)
    {
        this->value = other;
    }
}

class B : public A
{
public:
    void assignAdd5(int other)
    {
        this->value = other + 5;
    }
}
然后是代码:

A a = A();
B b = B();

a.assign(4);
b.assign(4);
我希望
assign
在这两种情况下都引用相同的方法(因此是相同的编译代码块),尽管类型不同,因为
B
a
的子类。如果是这种情况,那么让具有相似功能的类都继承自实现相似性的单个基类将产生比让每个类单独实现功能更少的编译代码,因为每个子类将使用相同的功能


我提供的关于引发这个问题的情况的信息仅仅是背景信息,我的问题在于是否任何编译器都是这样,而不仅仅是我正在使用的编译器(我完全理解答案可能是“可能有一些编译器这样做,但不是所有编译器都这样做”,这是一个完全可以接受的答案).

我不能给出确切的答案,但我想与大家分享我的发现。事实上,我并不像我预期的那样容易测量差异。不要把代码看得太严重,我只是在尝试随机的东西,看看它是否有任何影响

#include <iostream>
#define DERIVED
#define BASE_STUFF     int a,b,c,d,e,f,g,h,i,k,m,n,o,p,q,r,s,t,u,v,w,x,y,z; \
                       double foo1(int x){return x;}                        \
                       double foo2(int x){return x;}                        \
                       double foo3(int x){return x;}                        \
                       double foo4(int x){return x;}                        \
                       Base*  foo5(Base* x){return x;}                      \
                       FPTR   foo5(FPTR a,FPTR b,FPTR c){return a;}

typedef double (*FPTR)(int,int,double);

struct Base { BASE_STUFF };

#ifdef DERIVED
struct Derived : Base{double a0,a1,a2,a3,a4,a5,a6,a7;};
#endif

#ifndef DERIVED
struct Derived {
    double a0,a1,a2,a3,a4,a5,a6,a7;
    BASE_STUFF
};
#endif

int main(int argc, char *argv[])
{
    Base b;
    b.x = 1;
    std::cout << b.foo1(b.x);
    std::cout << b.foo5(&b)->foo2(b.a);
    Derived n;
    n.a0 = 2;
    std::cout << n.foo1(n.a0);
}
我得到一个13.312KB的可执行文件。这与是否定义了
派生的
无关。然而,当我用

g++ main.cpp -Os -fno-exceptions
大小为43.549KB。同样独立于是否定义了
派生的

我的结论是

  • 我的例子不能很好地衡量这种差异
  • …然而,使用编译器标志进行实验会产生巨大的差异,而继承与否差别不大
  • 我不会为了减少代码大小而改变设计。编写代码以便易于阅读、编写和使用,如果需要从exe中挤出一些kB,则可以使用编译器标志(另请参见)

编写一个完整的容器来完成这一切

私自继承。使用
using
将要公开的方法带到视图中


编译器最多会为dtor/ctor创建一些极短的方法。

为什么不试试看?@tobi303因为这很费时,可能有人已经知道答案,而我还没有找到这个问题的答案,所以我想其他人可能会从答案中受益。这不是批评,但最终数字可能会因您的具体情况而有所不同。我现在很好奇,并试图找到一个例子,说明它在某种程度上是相关的。不幸的是,公认的答案仅适用于windows,其中可执行文件的大小无关紧要。为什么有3种类型?一种。它支持前后推/弹出。它支持在中间添加。当用作
队列时
您。。。不要调用其他方法。只有当其中一种类型的折衷使得另一种类型的解决方案不理想时,才编写一个新类型,并且这一成本值得支持和提供更多代码。
g++ main.cpp -Os -fno-exceptions