预测以下C++程序的输出。
问题1
#include
using namespace std;
class Base
{
public:
int fun() { cout << "Base::fun() called"; }
int fun(int i) { cout << "Base::fun(int i) called"; }
};
class Derived: public Base
{
public:
int fun(char x) { cout << "Derived::fun(char ) called"; }
};
int main()
{
Derived d;
d.fun();
return 0;
}
输出:编译器错误。
在上面的程序中,派生类中无法访问基类的fun()。如果派生类创建的成员方法的名称与基类中的方法之一相同,则所有具有该名称的基类方法都将隐藏在派生类中(有关更多详细信息,请参见此方法)
问题2
#include
using namespace std;
class Base
{
protected:
int x;
public:
Base (int i){ x = i;}
};
class Derived : public Base
{
public:
Derived (int i):x(i) { }
void print() { cout << x ; }
};
int main()
{
Derived d(10);
d.print();
}
输出:编译器错误
在上面的程序中,x是受保护的,因此可以在派生类中对其进行访问。派生类构造函数尝试使用初始化程序列表直接初始化x,即使x是可访问的,也不允许这样做。基类的成员只能通过基类的构造函数调用来初始化。以下是更正的程序。
#include
using namespace std;
class Base {
protected:
int x;
public:
Base (int i){ x = i;}
};
class Derived : public Base {
public:
Derived (int i):Base(i) { }
void print() { cout << x; }
};
int main()
{
Derived d(10);
d.print();
}
输出:
10
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。