C++ 继承与超越问题

C++ 继承与超越问题,c++,inheritance,overriding,C++,Inheritance,Overriding,我现在有一个软件,它使用两个完全相同的类,它们有25个左右的数据成员,还有一个函数可以计算填充这些数据成员。两者的不同之处在于计算功能。每个类执行不同的计算以填充这25个私有数据成员 所以我所做的是创建一个基类,它有25个数据成员,并在这里创建了所有getter/setter方法,然后创建了两个继承这个基类的新类,并为每个继承这个基类的新类创建了一个计算函数。进行计算的函数在两个子类之间具有相同的名称,但在每个子类中执行不同的操作。我的问题是,有没有一种方法可以将计算函数包含在它们继承的基类中,

我现在有一个软件,它使用两个完全相同的类,它们有25个左右的数据成员,还有一个函数可以计算填充这些数据成员。两者的不同之处在于计算功能。每个类执行不同的计算以填充这25个私有数据成员


所以我所做的是创建一个基类,它有25个数据成员,并在这里创建了所有getter/setter方法,然后创建了两个继承这个基类的新类,并为每个继承这个基类的新类创建了一个计算函数。进行计算的函数在两个子类之间具有相同的名称,但在每个子类中执行不同的操作。我的问题是,有没有一种方法可以将计算函数包含在它们继承的基类中,并在每个子类中定义不同的函数?我对覆盖还是很陌生,但这是一个可以覆盖的地方吗?如果是这样的话,我该怎么做呢?我意识到这没什么大不了的,我只是在重复我自己,但我想让事情尽可能地干涸。

听起来你只是想在基类中使用纯虚拟函数。大概是这样的:

struct base {
  int field;
  virtual void set_field(int) = 0;
};

struct typeA : base {
  void set_field(int val) override { field = /* some function of */ val; }
};

struct typeB : base {
  void set_field(int val) override { field = /* some function of */ val; }
};
基类中的=0将set_字段声明为纯虚函数,这意味着基类中没有实现的函数。因为base有一个或多个纯虚函数,所以它是一个纯虚类,您永远不能创建base类型的对象,只能创建子类型的对象


然而,继承给您的是,您可以对基类(甚至是纯虚拟类)的指针或引用进行操作,而不需要知道派生类型是什么。这意味着您可以编写一个函数void fbase&它调用set_字段,并且您可以在typeA或typeB的对象上调用f。

您可以在随后的派生类中重写基类虚函数。太棒了!我认为这一切都有道理,除了几件事。您是否愿意详细说明为什么纯虚拟需要a=0;最后?这有点让人困惑,是不是因为它只是一个虚拟的函数,所以它就真的丢失了?另外,关于使用base*的注释,您是否能够扩展如何使用它,而不是使用类型a或B?我想我只是把一些东西混在一起了。@joe_04_04我在回答中澄清了这一点。非常感谢!现在一切都有意义了!:那么,既然我的基类定义了setter/getter,它就不能是纯虚拟类了?我试着让calculate函数成为纯虚拟函数,但编译器抱怨类没有纯虚拟析构函数,在我给它一个纯虚拟讲师后,它抱怨基类不是纯虚拟函数,但后来我意识到我定义了setter/getter方法,所以我假设我不能向它添加一个纯虚函数?