多态性vs常规继承
Polymorphism vs regular inheritance?
我经常使用多态性,但是我突然明白了。我的代码是:
class A{
class B : public A{
class C : public A{
和我使用类A
作为传递B
或C
子类型的多态参数类型:
//Accepts B and C objects
void aMethod(A* a){
然而,我给了A
一个虚析构函数——这是a(以及B和C)包含虚值表指针的唯一原因。
所以我的问题是,如果我没有用虚析构函数声明A,那么A就不会是多态的-我将无法在aMethod()
中传递B或C类型的对象??
在此代码中,
void aMethod(A a){
a
形式参数不是多态的。它通过值传递。当您传入B
或C
对象作为实际参数时,您只是将将切片为A
,也就是说,您仅复制A
基类子对象。
关于
”那么非多态继承只是关于共享代码,而多态性(基类必须有一个虚函数表)允许传递子类型作为基类类型的参数吗?
它结合了两个必须分开处理的问题。
从非多态类继承是关于代码共享,是的,但它也引入了一个is-a关系,这对于例如通过引用传递是很重要的。从多态类(具有一个或多个虚成员函数的类)继承,允许您重写基类功能,或者在基类将其作为派生类责任的地方实现;通常通过使用纯虚成员函数。这意味着基类中的成员函数可以调用派生类。成员函数。而且,通过基类指针或引用调用成员函数,可以调用派生类的实现。
非多态类型也包含每个基类的子对象,并且向上转换仍然是隐式的。
因此,即使没有多态性,也可以很好地传递派生类的对象。接收器将作用于基本子对象,就像发生在多态类型的数据成员和非虚函数上一样。一个类的析构函数是唯一的virtual
方法,就像您的class A
一样,这是一个奇怪的现象。据我所知,在设计良好的代码中,这样的类是没有必要的。
从你的问题来看,目前还不清楚virtual
析构函数是否需要(即,如果你通过对A
类的引用或指针调用B
或C
类的析构函数),但如果是,你的代码有味道。如果不是,则只需将析构函数设置为非虚函数。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- C++错误LNK2005和不同项目文件的常规继承
- 多态性vs常规继承