设计一个虚基类Staff(员工),包括编号、姓名和年龄保护数据成员以及相关的成员函数;由Staff派生出工程

设计一个虚基类Staff(员工),包括编号、姓名和年龄保护数据成员以及相关的成员函数;由Staff派生出工程,第1张

我直接粘个网址吧,面向CSDN编程(手动狗头)。

估计老哥也是C++大作业?看来学计算机毕业后很可能给人家做管理系统🌚

https://blogcsdnnet/qq_41122796/article/details/86644391

我来回答吧:

#1他也不实例化对象 写那个干啥

在你这个例子中的确没有什么用。虽然有纯虚函数的类不能被实例化,但是它可以被继承,子类的构造过程就调用父类的构造函数的。所以当虚类有构造逻辑时,写构造函数是正常的。

#2我就是把它去掉了 也能运行 为什么

你的这个例子因为构造函数为空,其实和没写一样。删除后,编译器其实会自动生成一个构造函数的,也是什么都不做,一个空函数。

#3程序中构造函数是普通的 为什么析构函数写成了 虚函数形式?

虚析构函数是为了确保类的实例能够被正确析构。因为非虚函数的调用的代码是在链接期绑定的,而完全可能出现本来是类SubClass的实例,你转换为FatherClass的指针了,这个时候会导致父类的析构函数被调用,而导致错误的析构。所以C++的书上基本上都是建议将可能被继承的类的析构函数声明为虚函数。(虚函数的调用是运行期绑定的)

" 基类中有个 void fun(){},派生类中也用void fun(){};"

和 "基类中有个 virtual void fun(){},派生类中用void fun(){};" 它们有差别,这些差别主要体现在多态上。

前者 表明基类中的函数被派生类函数覆盖了,它们几乎没有关联,在C++中就是两个完全不同的函数,只不过恰巧名字一样而已(但有不同的类作用域),就像在不同的作用域定义了两个相同名字的变量。

int a; //类似基类中的fun()

namespace

{

int a; //类似派生类中的fun(),作用域不同

};

而在基类中加了 virtual 的函数表明该函数是虚函数,它用在多态里面,派生类定义了fun()表示派生类重写了这个函数,它们是有关联的,当通过引用或者指针调用fun()时,将会进行多态解析,根据调用对象来决定调用那一个函数。

在没有用多态的情况下,两者就是一样的,只不过加了 virtual 的函数运行速度可能会慢一些(视编译器优化程度而定)。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12156635.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存