C++程序的输出| 15套
预测以下 C++ 程序的输出。
问题 1
#include
using namespace std;
class A
{
public:
void print() { cout << "A::print()"; }
};
class B : private A
{
public:
void print() { cout << "B::print()"; }
};
class C : public B
{
public:
void print() { A::print(); }
};
int main()
{
C b;
b.print();
}
输出:编译器错误:“A”不是“C”的可访问基础
上面的代码中存在多级继承。请注意“class B : private A”中的访问说明符。由于使用了私有访问说明符,“A”的所有成员在“B”中都变为私有。 “C”类是“B”的继承类。继承的类无法访问父类的私有数据成员,但 'C' 的 print() 尝试访问私有成员,这就是我们得到错误的原因。
问题2
#include
using namespace std;
class base
{
public:
virtual void show() { cout<<" In Base \n"; }
};
class derived: public base
{
int x;
public:
void show() { cout<<"In derived \n"; }
derived() { x = 10; }
int getX() const { return x;}
};
int main()
{
derived d;
base *bp = &d;
bp->show();
cout << bp->getX();
return 0;
}
输出:编译器错误:'class base' 没有名为 'getX' 的成员
在上面的程序中,有一个'base'类型的指针'bp'指向一个派生类型的对象。 show() 通过 'bp' 的调用很好,因为 'show()' 存在于基类中。事实上,它调用派生类“show()”,因为“show()”在基类中是虚拟的。但是对 'getX()' 的调用是无效的,因为基类中不存在 getX()。当基类指针指向派生类对象时,它只能访问派生类中存在于基类中的虚拟方法。
问题 3
#include
using namespace std;
class Test
{
int value;
public:
Test(int v = 0) { value = v; }
int getValue() { return value; }
};
int main()
{
const Test t;
cout << t.getValue();
return 0;
}
输出:编译器错误
在上面的程序中,对象 't' 被声明为一个 const 对象。 const 对象只能调用 const 函数。为了修复这个错误,我们必须让 getValue() 成为一个 const函数。