以下继承中,哪些访问是合法的 A. class A { public: int a; A(int a=0):a(a){} }; class B :public A { public: B():A(){} }; int main() { B b; cout<<b.a; return 0; } B. class A { protected: int a; public: A(int a=0):a(a){} }; class B :public A { public: B():A(){} }; int main() { B b; cout<<b.a; return 0; } C. class A { public: int a; A(int a=0):a(a){} }; class B :protected A { public: B():A(){} }; int main() { B b; cout<<b.a; return 0; } D. class A { protected: int a; public: A(int a=0):a(a){} }; class B :protected A { public: B():A(){} void show() { cout << a; } }; int main() { B b; b.show(); return 0; }
时间: 2024-01-10 14:05:07 浏览: 24
合法的访问是 A 和 D。
在 A 中,成员变量 a 是公有的,因此可以在类外访问和派生类中访问。
在 B 中,继承的 A 类中的成员变量 a 是受保护的,因此只能在派生类中访问。因此,C 和 B 中的访问都是不合法的。
在 D 中,继承的 A 类中的成员变量 a 是受保护的,因此可以在派生类中访问。同时,类 B 中的 show() 函数也是可以访问 a 的。
相关问题
以下定义是否正确( )。 class A { public: int n=0; void fun(); };
这个定义是不正确的。在类定义中,不能直接初始化非静态成员变量。正确的写法应该是在类定义中声明非静态成员变量,但不进行初始化,在类外部定义成员函数时进行初始化,例如:
```
class A {
public:
int n;
void fun();
};
void A::fun() {
n = 0; // 在成员函数中初始化成员变量
}
```
以下对类A的定义中正确的是() A. class A{private:int v;public : void Func(){}} B. class A{private : int v;A *next;}; C. class A{int v;public:void Func();};A::void Func(){} D. class A{int v;public: A next;void Func(){ }};
选项A和C是正确的类A的定义。
选项A中,类A定义了一个私有成员变量v和一个公有成员函数Func(),其中Func()没有参数和返回值。这是一个合法的类定义。
选项B中,类A定义了一个私有成员变量v和一个私有成员指针变量next。由于next是私有的,无法直接访问,也无法被类外部使用。因此,这个定义是不正确的。
选项C中,类A定义了一个私有成员变量v和一个公有成员函数Func(),其中Func()没有参数和返回值。另外,类外部还定义了Func()的实现,实现中访问了类的私有成员变量v。这也是一个合法的类定义。
选项D中,类A定义了一个私有成员变量v和一个公有成员函数Func(),同时定义了一个公有成员变量next,类型为A。由于A的大小是未知的,所以定义A类型的变量作为类的成员变量是不合法的。因此,这个定义是不正确的。
因此,正确答案是A和C。