OJ: OpenJudge
022:看上去像多态
这个题也较为简单,需要编写类D(公有继承于类B)
通过分析主函数可以发现,需要编写一个新的变量,还要编写构造函数、print、fun
class D:public B
{
private :
int d;
public:
D(int n) :B(n*3) {
d = n;
};
void Fun()
{
cout << "D::Fun" << endl;
}
void Print()
{
this->B::Print();
cout << "nDVal=" << d << endl;
}
};
构造函数通过分析输出数据可以直到,建立D的对象时对B的构造函数赋值是本身的3倍。
Fun的话改一下输出就行。
print则需要先调用B的print再输出D的对象的变量。
023:Fun和Do
这个题也比较容易,让编写参数,发现Do是虚函数,Fun不是,而输出A,C。那么分析后得知参数为 B& p.
这里调用Fun,Fun不是虚函数,找p对象里的,是A中定义的Fun
调用Do,Do是虚函数,p引用的是C的对象,调用C的虚函数。
024:这是什么鬼delete
这道题考的是虚析构函数,这样就满足题意
virtual ~A()
{
cout << "destructor A" << endl;
}
025:怎么又是Fun和Do
跟上面类似,主函数先传来A对象的指针,又传了C对象的指针,那用什么接收呢?
答案是A* p
前者不用解释,后者跟上面一样,指向的是C的对象,调用其虚函数
026:编程填空:统计动物数量
这道题其实就是编写3个类,对每个类定义一个静态变量number,这样才能被访问。
一个构造函数,一个析构函数,构造函数里执行number++操作,析构直接让number=对应的值即可。
class Animal
{
public:
static int number;
Animal()
{
number ++;
}
~Animal()
{
number = 3;
}
};
class Dog :public Animal
{
public:
static int number;
Dog()
{
number++;
}
~Dog()
{
number = 2;
}
};
class Cat :public Animal
{
public:
static int number;
Cat()
{
number ++;
}
~Cat()
{
number = 1;
}
};
int Animal::number = 0;
int Dog::number = 0;
int Cat::number = 0;
注意,静态变量要初始化。