多态性vs常规继承

Polymorphism vs regular inheritance?

本文关键字:继承 常规 vs 多态性      更新时间:2023-10-16

我经常使用多态性,但是我突然明白了。我的代码是:

class A{
class B : public A{
class C : public A{

和我使用类A作为传递BC子类型的多态参数类型:

//Accepts B and C objects
void aMethod(A* a){

然而,我给了A一个虚析构函数——这是a(以及B和C)包含虚值表指针的唯一原因。

所以我的问题是,如果我没有用虚析构函数声明A,那么A就不会是多态的-我将无法在aMethod()中传递B或C类型的对象??

所以非多态继承只是关于共享代码,而多态性(基类必须有一个虚函数表)允许传递子类型作为基类类型的参数?

在此代码中,

void aMethod(A a){

a形式参数不是多态的。它通过值传递。当您传入BC对象作为实际参数时,您只是将切片为A,也就是说,您仅复制A基类子对象。


关于

那么非多态继承只是关于共享代码,而多态性(基类必须有一个虚函数表)允许传递子类型作为基类类型的参数吗?

它结合了两个必须分开处理的问题。

从非多态类继承是关于代码共享,是的,但它也引入了一个is-a关系,这对于例如通过引用传递是很重要的。

从多态类(具有一个或多个虚成员函数的类)继承,允许您重写基类功能,或者在基类将其作为派生类责任的地方实现;通常通过使用纯虚成员函数。这意味着基类中的成员函数可以调用派生类。成员函数。而且,通过基类指针或引用调用成员函数,可以调用派生类的实现。

非多态类型也包含每个基类的子对象,并且向上转换仍然是隐式的。

因此,即使没有多态性,也可以很好地传递派生类的对象。接收器将作用于基本子对象,就像发生在多态类型的数据成员和非虚函数上一样。

一个类的析构函数是唯一的virtual方法,就像您的class A一样,这是一个奇怪的现象。据我所知,在设计良好的代码中,这样的类是没有必要的。

从你的问题来看,目前还不清楚virtual析构函数是否需要(即,如果你通过对A类的引用或指针调用BC类的析构函数),但如果是,你的代码有味道。如果不是,则只需将析构函数设置为非虚函数。