首页 > 试题广场 >

下列程序的输出结果是?

[单选题]
下列程序的输出结果:
#include <iostream>
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:print()
  • B:print()
  • 编译出错
B的继承为私有继承,对于C已经不能再调用A的所有方法了
发表于 2015-06-22 15:05:24 回复(2)
此题考查的是 派生类继承(public,private)基类成员后,继承的基类成员在派生类中的相应权限的
改变。  例如public继承, 基类的各类(public,protected,private)成员在派生类中权限与原来在
基类时保持一致; 而private继承,基类的各类成员在派生类中权限均变为private, 譬如C类中的print
调用A::print(),因为A::print()此时在C类中为private等级,不能被C类任何成员所访问,故不能通过
编译。

发表于 2018-03-29 21:09:37 回复(1)
gotojyh正解,就是在考private继承。
B private继承自A,A中的成员函数A::print在B中已经成为private的,C再public继承自B,C中已经不能访问基类B中继承来的已变成private的A::print。
编辑于 2016-08-28 14:27:15 回复(1)
这个题目的本意应该是使用A::,域作用符吧,而不是:
如果使用“::”那么就是编译错误,无法继承私有成员
如果使用”:“编译会通过,但是运行的时候会出错

发表于 2015-10-19 14:19:50 回复(0)
A在这儿只是一个标识符的名字,而不是转到类A那个位置。只是标志当前A:的那个位置,不起任何作用。有无这个A:无影响,所以递归调用了自身的print函数,导致函数堆栈溢出。故编译不通过
发表于 2015-09-03 18:23:23 回复(4)
继承方式/基类成员
public成员
protected成员
private成员
public继承
public
protected
不可见
protected继承
protected
protected
不可见
private继承
private
private
不可见
发表于 2019-08-16 18:52:17 回复(0)
print()方法在A类不是静态的,不能通过类作用域符来访问

发表于 2017-02-20 16:49:34 回复(2)
选 C
B private 继承A,print在B里变为  private 函数,C pulic 继承 B,不能访问B中private成员。A::print() 这个访问出错
编辑于 2016-04-23 15:13:54 回复(0)
B类中出现了和A类一样的print函数,这不是重定义么,会隐藏掉A类的print函数,就是不能通过派生类对象去调用基类的那个函数了,后面也是同样的意思啊,c类对象不能调用B的print函数,也不能调用A类的print函数。main函数里面c类对象调用print函数,会调用c类的print函数,但不能调用A类的print函数,这不是选C,编译错误么。我这样解释对么?
发表于 2022-10-27 21:38:36 回复(0)
#include <iostream>
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()
    {
B:: print();
    }
};
int main()
{
    C c;
    c.print();
}
将类C中改为B::print()就可以通过编译。
B、C类均对基类中函数print进行重写,B类中print函数覆盖了基类print,但可以调用基类print如A::print()。
print函数在A中是public,在B中是私有,在C中是不可访问的。
基类中函数在派生类中一直存在,如果不重写的话,在所有派生类中函数为A::print()(派生类对象调用函数一般省略A),只不过分别属于各自的类,属性也不相同。
发表于 2017-05-13 20:49:55 回复(0)
B私有继承A,使A的print函数成为B的私有成员函数,C共有继承B,但是在C中不能访问B的私有成员或私有函数

发表于 2017-05-03 16:27:45 回复(0)
对于该程序,有以下理解,B私有继承自A,则A中print对于B来说是私有的,对于C来说是不可访问的。
发表于 2016-08-31 11:03:08 回复(0)
选 C B private 继承A,print在B里变为  private 函数,C pulic 继承 B,不能访问B中private成员。A::print() 这个访问出错
发表于 2016-05-27 17:42:52 回复(0)
主函数中:类C的一个对象b调用print()函数,类C中的print()函数又调用类A中的print()函数,但由于类C公有继承于类B,而类B私有继承于类A,所以类C不能调用类A中的函数,因此会编译出错!
发表于 2017-07-15 09:32:57 回复(0)
class B : private A中改成公有继承就能正常运行代码,VS2022验证
发表于 2022-09-04 09:30:05 回复(0)
发表于 2022-09-02 16:19:22 回复(0)
好像在考細心程度,但這種編譯器會很明確報錯的問題,比較像在考編譯器的編譯速度。
发表于 2021-02-21 05:24:06 回复(0)
发表于 2020-12-09 15:37:51 回复(0)
主函数中:类C的一个对象b调用print()函数,类C中的print()函数又调用类A中的print()函数,但由于类C公有继承于类B,而类B私有继承于类A,所以类C不能调用类A中的函数,因此会编译出错!
发表于 2020-12-05 12:01:55 回复(0)