首页 > 试题广场 >

下列程序编译时会出现错误,请根据行号选择错误位置( )

[不定项选择题]
下列程序编译时会出现错误,请根据行号选择错误位置( )
#include <iostream>
using namespace std;
class A{
  int a1;
protected:
  int a2;
public:
  int a3;
};
class B: public A{
  int b1;
protected:
  int b2;
public:
  int b3;
};
class C:private B{
  int c1;
protected:
  int c2;
public:
  int c3;
};
int main(){
  B obb;
  C obc;
  cout<<obb.a1;//1
  cout<<obb.a2;//2
  cout<<obb.a3;//3
  cout<<obc.b1;//4
  cout<<obc.b2;//5
  cout<<obc.b3;//6
  cout<<obc.c3;//7
  return 0;
}
  • 1,2
  • 2,5,7
  • 3,4,7
  • 4,5,6
类的继承后方法属性变化:

private 属性不能够被继承。

使用private继承,父类的protected和public属性在子类中变为private;

使用protected继承,父类的protected和public属性在子类中变为protected;

使用public继承,父类中的protected和public属性不发生改变; 

private, public, protected 访问标号的访问范围:

private:只能由1.该类中的函数、2.其友元函数访问。
不能被任何其他访问,该类的对象也不能访问。

protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
但不能被该类的对象访问。

public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。
 
注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。
发表于 2016-09-03 12:08:56 回复(10)
cout<<obb.a1;//1   a1是A私有的
cout<<obb.a2;//2   a2是A开放给派生类使用的,客户代码不能使用
cout<<obc.b1;//4   C是私有继承于B,不能使用B的成员
cout<<obc.b2;//5   同上
cout<<obc.b3;//6   同上
发表于 2016-08-29 15:45:23 回复(9)

派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承而来的成员,访问权限受下面因素影响。

  • 继承方式;
  • 基类成员的访问权限(即public/private/protected)。

继承有三种方式,即公有(Public)继承、私有(Private)继承、保护(Protected)继承。(私有成员不能被继承)

  • 公有继承就是将基类的公有成员变为自己的公有成员,基类的保护成员变为自己的保护成员。
  • 保护继承是将基类的公有成员和保护成员变成自己的保护成员。
  • 私有继承是将基类的公有成员和保护成员变成自己的私有成员。
三种继承方式的比较:



具体示例代码,参见:
https://github.com/xuelangZF/CS_Offer/blob/master/Coding/C++_Inheritance.cpp

关于类的更多内容,参考
https://github.com/xuelangZF/CS_Offer/blob/master/C%2B%2B/Class.md
发表于 2016-09-15 18:02:17 回复(5)
经过继承之后,各类中成员的属性情况为:
A:
public:a3
private:a1
protected:a2
B:public A
public:a3  b3
private:b1
protected:a2  b2
C:private B
public:c3
private:c1 a2  a3  b2  b3
protected:c2

cout<<obb.a1;   三种继承方式中,private属性不能被继承到派生类中,所以类A的a1没有被继承到类B中,不能访问;
cout<<obb.a2;   类A的保护属性变量a2被公有继承到类B中依然为保护属性,但它只能在派生类中被访问,而不能通过类的对象访问;
cout<<obb.a3;   a3为类B的公有成员,正确;
cout<<obc.b1;   错误,私有属性不被继承到派生类中;
cout<<obc.b2;   错误,私有属性能通过类中的成员函数进行访问,而不能通过类的对象直接对私有数据成员进行访问;
cout<<obc.b3;   错误,同上;
cout<<obc.c3;   c3为为类C的公有成员,正确;

发表于 2019-02-25 14:36:05 回复(1)
a1默认私有
发表于 2016-09-11 20:33:21 回复(0)
http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html
发表于 2016-08-29 16:21:42 回复(0)
发表于 2018-07-10 11:00:58 回复(0)
class 默认的是private
stuct 是public
发表于 2017-05-17 21:20:11 回复(0)
为什么a2是错误的??派生类不是可以访问基类的保护成员吗??
发表于 2017-05-24 15:53:31 回复(2)
详见此图:

编辑于 2018-11-30 22:21:01 回复(0)
类的继承后方法属性变化: private 属性不能够被继承。 使用private继承,父类的protected和public属性在子类中变为private; 使用protected继承,父类的protected和public属性在子类中变为protected; 使用public继承,父类中的protected和public属性不发生改变!
发表于 2018-10-20 14:48:30 回复(0)

继承有三种方式,即公有(public)继承,私有(private)继承,保护(protected)继承。(私有成员(private属性)不能够被继承)

1. 公有继承就是将基类的公有成员变为自己的公有成员,基类的保护成员变为自己的保护成员。

2. 保护继承是将基类的公有成员和保护成员变成自己的保护成员。

3. 私有继承是将基类的公有成员和保护成员变成自己的私有成员。

private,public,protected访问标号的访问范围:

private:只能由(1)该类中的函数(2)其友元函数访问

不能被任何其他访问,该类的对象也不能访问

protected:可以被(1)该类中的函数(2)子类的函数(3)其友元函数访问

但不能被该类的对象访问

public:可以被(1)该类中的函数(2)子类的函数(3)其友元函数访问(4)该类的对象访问。

cout<<obb.a1;//1  a1是A私有的

cout<<obb.a2;//2  a2是A开放给派生类使用的,客户代码不能使用

cout<<obc.b1;//4  C是私有继承于B,不能使用B的成员

cout<<obc.b2;//5  同上

cout<<obc.b3;//6  同上 

发表于 2017-05-09 09:38:27 回复(0)
继承方式有三种, 决定了基类中的成员在派生类内部和外部的访问权限。
        public 公有继承
            基类的公有成员,成为派生类的公有成员
            基类的私有成员,成为派生类的一部分,但派生类不可直接访问。
            基类的保护成员,成为派生类的保护成员
            struct在继承时,默认继承方式为 public

        private 私有继承
            基类的公有成员,成为派生类的私有成员
            基类的私有成员,成为派生类的一部分,但派生类不可直接访问。
            基类的保护成员,成为派生类的私有成员
            class在继承时,默认继承方式为 private

        protected 保护继承
            基类的公有成员,成为派生类的保护成员
            基类的私有成员,成为派生类的一部分,但派生类不可直接访问。
            基类的保护成员,成为派生类的保护成员
发表于 2023-10-30 14:44:15 回复(0)
类成员默认是私有的

发表于 2024-03-08 11:47:37 回复(0)
2之所以错了,是因为继承过来a2有受保护权限,不能直接访问
发表于 2023-05-18 19:09:58 回复(0)
哥么只想知道答案为什么是1,2
发表于 2022-09-29 09:26:33 回复(0)
通过private继承后,继承过来的对象访问权限变为private,不能通过对象来访问私有成员
发表于 2022-05-24 21:00:29 回复(0)
原来这是个多选题
发表于 2020-03-01 14:10:56 回复(0)
成功避开所有正确选项。
发表于 2018-11-21 16:37:00 回复(0)
cout<<obb.a1;//a1是A的私有成员,派生类不能访问
  cout<<obb.a2;//a2是A的保护成员,派生类可以访问,但只能调用成员或友元函数访问(只有public可以用对象直接访问)
  cout<<obb.a3;//正确,a3是A的public成员,且为public继承,继承后为B的public成员,可直接调用
  cout<<obc.b1;//b1是B的private成员,派生类不能访问
  cout<<obc.b2;//b2经C的private继承后,成为C的private成员,不能直接用对象访问,要用函数访问
  cout<<obc.b3;//同上
  cout<<obc.c3;//正确,c3是C的public成员,可直接用对象调用
发表于 2018-08-21 12:27:48 回复(0)