-
首先,你的第一个问题,; 这里涉及到一个C++原理,一个子类有一个和父类同名的函数,如果它不是虚函数,就会“隐藏”父类的功能,不管参数是否相同! 所以你的dd::vf2(int
i) 这个函数隐藏了 bb::vf2(),所以 dd 不会继承这个函数。至于为什么会这样设计,好像我曾经在某处看过一个采访,说是为了减少出错的几率,这样子类的用户就不会误用父类的功能。
看起来第二个问题与第一个问题相同,但结果不同,但您应该查看 C++ 的对象模型,您将知道它是如何工作的。
对于虚函数来说,它是动态绑定的,对象内部有一个虚函数表,表内是函数指针,指向当前对象的真实虚函数,当你执行调用虚函数时,你会去这个表查看,然后取出函数指针再次调用。
如果它是一个非虚函数,它是静态绑定的,这意味着它已经确定了在编译时调用哪个函数!
无论 b::vf2、d::vf2 和 d::vf3 是否为非虚函数,都会发生静态绑定。
这意味着编译器将决定在编译时调用哪个函数。 它是如何决定的? 看类型。 如下:
bp->vf2();
在这句话中,编译器看到 bp 是 b* 类型,于是去找函数 b::vf2(),找到了,绑定成功了。
在这句话中,编译器看到 d 是 d 类型的,于是去找函数 d::vf2(),由于上面提到的隐藏原理,d 不存在这个函数,所以它没有找到它,是错误的。
dp->vf2();
在这句话中,编译器看到 dp 是 d* 类型,于是去找函数 d::vf2(),所以和上面一样,找不到,有错误。
dp->vf3();编译器发现 dp 的类型为 d*,因此它查找函数 d::vf3(),找到它,并成功绑定。
分析了这四句话中编译器的行为,你就会明白了。
我写了这么多,你为什么不多加点......
-
想写就写不了,呵呵,我想说我在学编程或者你在学编程,写一个工人人,里面有一个虚拟函数工资,三种类型的工人继承这个类,重写这个工资函数,剩下的乱七八糟的一起写。
-
留言! 希望能帮到你,**不知道前再问。
-
多态性是指允许不同类的对象响应相同的消息。 多态性包括参数多态性和包含性多态性。 多态语言具有灵活性、抽象性、行为共享、共享等优点,解决了同名应用函数的问题。
多态性以两种形式表现出来:重载和覆盖。
首先,重载发生在同一个类中。 这与Shibu Chimo的父亲,子阶级和继承无关。
除函数名称外,还标识函数的参数(编号和类型)。 也就是说,一个类中可以有两个或多个函数,具有相同的名称和不同的参数。
它们彼此无关,它们是不同的功能,但也许它们的功能相似,因此它们的名称相同,增加了可读性,仅此而已!
覆盖发生在子类中! 这意味着必须有继承才能进行重写。
我们知道,继承一个类,我们拥有父类的所有方法,如果你觉得某个方法不舒服并且函数要改变,那么在子类中重新实现该函数。
在这种情况下,当再次调用该方法时,将执行子类中的进程。 父类中的函数将被覆盖。 (当然,函数名和参数应该和父类中的参数完全一样,否则你的方法对父类中的方法没有影响,因为两者是两个函数,彼此无关)。
a a=new c();
对象是使用父类 A 创建的,调用的方法是 A 中的方法。
c a=new c()
创建一个子类 C 的对象,并取笑 C 中的方法。
-
继承意味着一个子类可以自动获取父类提供的函数,如果父类提供 foo 函数回馈,则子类也会有一个 foo 函数。
多态性是指: 答,子类可以重写父类的函数,以提供与父类不同的行为的函数。 一个父类的多个子类可以提供同一函数的不同实现,从而在父类的公共接口下表现出各种行为。
当然,对于上述自动获取和重写,也有访问级别的概念。 例如,可以使用此类限制覆盖公共函数或受保护函数。
-
继承:子类以某种方式继承基类的成员和函数。
如果在此指针处定义指向基类的指针,并将对象从子类传递到基类指针。 假设子类和基类具有相同的功能。 那么,如果这个指针调用这个函数,它是基类的函数还是子类的函数?
答案是:基类的函数。 因为函数的调用取决于基类的指针类型,而不是指针指向的对象类型。
下面是它的样子:类形状
class crect:public shape
shape* pshape;
crect rct;
pshape=&rct;最好不要使用子类指针指向基类对象,因为这很危险。
pshape->display();它调用基类形状的显示函数,即绘制多个多边形,这个属性是函数的通用性,即指针调用的函数取决于指针的类型,而不是它所指向的对象的类型。 如果基类有很多子类,并且每个子类定义一个函数来覆盖基类的函数,并且多个基类指针指向不同的子类对象并调用子类的覆盖函数,那么这些指针的行为是相同的,即它们都调用基类的函数而不是子类对应的函数。
从上面可以看出,这个功能不是多态的,因为它不会自动调用对象的函数以及它所指向的对象。 那么这个功能是如何实现的呢? 这就是一种技术的用武之地,即虚拟功能。 虚函数是实现多态性的方法。
虚函数只是函数前面的虚函数。
一种更特殊的虚函数类型是纯虚函数。
它的目的:一个纯粹的虚函数不能定义一个函数的实际动作,它的存在只是为了能够在一个派生的范畴中重新定义它,实现实在属性。
定义方式:虚函数类型 函数名称(参数)= 0;请务必“= 0”。
它的约束:如果一个类具有纯虚函数,那么该类被称为抽象类,它不能定义对象。
-
C++ 中有两种类型的继承:单继承和 ()。
正确答案:多重继承。
-
多重继承可以看作是单一继承的延伸。 所谓多重继承,就是派生类有多个基类,派生类与各基类的关系,仍可看作是单次继承。
多重继承下派生类的定义格式如下:
class “派生类名”: “继承方法 1> ”基类名 1> “继承方法 2> ”基类名 2>,...
派生的类主体
其中,“继承方式1>和”继承方式2>,...它是三种继承方法之一:公共、私有和受保护。 例如:
class a
class b
class c : public a, public b
其中,派生类 c 有两个基类(类 A 类和类 B),因此类 C 是多重继承的。 根据继承规定,派生类 c 的成员包括基类 A 和 B 的成员,以及类本身的成员。
具有多个继承的构造函数。
在多重继承的情况下,派生类的构造函数格式如下:
派生类名(“常规参数表”):基类名称 1>(“参数表 1>”)、基类名 2>(“参数表 2>”)、子对象名(“参数表 N+1>”)、派生类构造函数主体”。
其中,“通用参数表”中的每个参数都包含以下子参数表。
多重继承下派生类的构造函数类似于单次继承下派生类的构造函数,它必须负责同时调用该派生类的所有基类构造函数。 同时,派生类的参数数必须包括完成所有基类初始化所需的参数数。
派生类的构造函数的执行顺序是先执行继承的基类的构造函数,然后再执行派生类本身的构造函数,同一级别的每个基类的构造函数的顺序取决于定义派生类时指定的每个基类的顺序, 并且与派生类构造函数中定义的成员初始化列表的顺序无关。也就是说,基类构造函数的执行顺序取决于定义派生类时基类的顺序。 可以看出,派生类构造函数的成员初始化列表中的项的顺序可以任意排列。
-
3 选择 B,显然不可能也没有必要让一个类多次成为派生类的直接基类。 一个类可以多次成为派生类的间接基类,但是需要使用虚拟继承,如果不是虚拟继承,就不能多次成为派生类的间接基类,否则在访问基类数据时,派生类不知道要访问哪个基类成员, 但虚拟继承可以保证数据的唯一性,同一个基类只会有一个数据;
4.选择D,这不言而喻,规则的问题已经死了。