C++继承与派生题....

2024-12-29 05:38:10
推荐回答(1个)
回答1:

你的问题是涉及到继承与覆盖的问题....
c++ 重载 覆盖 隐藏的区别和执行方式
成员函数被重载的特征
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
覆盖是指派生类函数覆盖基类函数,特征是
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
3种情况怎么执行:1。重载:看参数2。隐藏:用什么就调用什么3。覆盖:调用派生类
//////////////////////////////////////////////////////////////////////
也就是含有纯虚函数的基类:
class A
{
public:
virtual void f() = 0;
};
class B : public A
{
public:
virtual void f()
{
cout < < "Hello, World! " < < endl;
}
};
像这样,基类A中含有纯虚函数,在派生类B中实现
///////////////////////////////////////////////////////////////////////////////
如果某个派生类的部分或全部直接基类是从另一个共同的基类派生而来,在这些基类中,从上一级基类继承来的成员就有相同的名称,则在这个派生类中访问这个共同的基类中的成员时,可能会产生二义性,此时,可定义虚基类。这就要求在其直接基类的定义中,使用关键字virtual将那个共同的基类定义为虚基类,其语法形式如下:
class 派生类名: virtual 派生方式 基类
虚基类的初始化与一般的多重继承的初始化在语法上是一样的 ,但构造函数的调用顺序不同,虚基类构造函数的调用顺序是这样规定的:
1)在同一层次中,先调用虚基类的构造函数,接下来依次是非虚基类的构造函数,对象成员的构造函数,派生类的构造函数。
2)若同一层次中包含多个虚基类,这些虚基类的构造函数按对他们说明的先后次序调用
3)若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类构造函数。
///////////////////////////////////////////////////////////////////////////////
多继承体系中:
class B{};
class A : public B{};
class C : public B{};
class D : public A, public C{};
A里有个B,C里也有个B,则D里会有两个B。
如果
class B{};
class A : virtual public B{};
class C : virtual public B{};
class D : public A, public C{};
B是A,C,以及更高层D的虚基类,此时
A里有个B,C里也有个B,但D里只有一个B。
-------------------------------------------------------------------------------
前面是一些概念,下面是对你的一些提问进行回答(可能有误,多指教):
【1】,calc(); 被基类calc();隐藏
【2】,class D: virtual public B 虚基类
【3】,void fn(B &t) 的形参是B &t,而形参改为void fn(D &t) 就会出错