一、
#include <iostream>
using namespace std;
class Base {
public:
Base(int j) : i(j) {}
virtual ~Base() {}
void func1() {
i *= 10;
func2();
}
int getvalue() {
return i;
}
protected:
virtual void func2() {
i++;
}
protected:
int i;
};
class Child : public Base {
public:
Child(int j) : Base(j) {}
void func1() {
i *= 100;
func2();
}
protected:
void func2() {
i += 2;
}
};
int main() {
Base* pb = new Child(1);
pb->func1();
cout << pb->getvalue() << endl;
delete pb;
return 0;
}
输出的结果是(102)
官方解释:
-
基类
Base:定义了一个整数成员i和两个虚函数func1和func2。func1函数首先将i乘以10,然后调用func2。func2在基类中的实现是将i加1。 -
派生类
Child:从Base类公开继承。它重写了func1和func2函数。在Child中,func1首先将i乘以100,然后调用func2。func2在派生类中的实现是将i加2。 -
main函数:创建了一个指向Child对象的Base指针pb。通过pb调用func1函数。由于多态性,将调用Child类中的func1。最后,输出i的值并删除动态分配的对象。
程序的输出将取决于func1和func2的调用顺序以及它们在基类和派生类中的实现。在这个例子中,由于Child类重写了func1和func2,所以最终i的值将会是1 * 100 + 2 = 102(Child类的func1乘以100,然后Child类的func2加2)。输出将是102。
自己的理解:
假设现在我们有两个这样的魔法盒子,一个是爸爸的,一个是孩子的。爸爸的盒子只有“变大10倍并加1”这个按钮,而孩子的盒子既有“变大10倍并加1”按钮,又有“变大100倍并加2”按钮。
但是,孩子很调皮,他把他的盒子给了爸爸,并且让爸爸以为这就是他的盒子。当爸爸按下“变大10倍并加1”这个按钮时,其实他按的是孩子盒子的按钮,所以盒子的东西会按照孩子的规则来变大。
假设一开始盒子里有1个苹果,当爸爸按下按钮后,这个苹果会先变成100个(因为是按照孩子的盒子的“变大100倍”规则),然后再加2个,最后盒子里就有102个苹果了。
最后,爸爸会告诉我们盒子里有多少个苹果,我们就知道了。
在这个例子中,爸爸的盒子就像是基类Base,孩子的盒子就像是派生类Child。爸爸按下的

最低0.47元/天 解锁文章
591

被折叠的 条评论
为什么被折叠?



