我有这段代码(考试中的问题),代码中有很多错误,这里是代码:
class A
{
int z;
static int y;
public:
A() {(*this).incrementY();}
int x () { y=y+2; return z;}
static int getY(){ return z;}
void incrementY() {y++}
};
class B: A
{
public:
B (): A() {(*this).incrementY();};
};
class C : public B
{
public:
C(): B() {(*this).incrementY;() }
};
int main()
{
A::x();
A a;
a.getY();
A::getY();
B b;
C c;
C::getY();
b.x();
}
有一个私有继承。这意味着B中的所有方法和变量对从B继承的任何类变为私有?
答案 0 :(得分:3)
有很多你不能不累。以下是一些:
void incrementY() {y++}
;
之后的y++
。
24. A::x();
不能通过类名调用非静态成员。
25. A a;
没有静态成员y
的定义。如果y
是const
,那就没关系。这有点棘手,所以我引用。
9.4.2静态数据成员
- 之外,它可能是不完整的类型。
在类定义中声明静态数据成员不是定义,除了cv-qualified void [...]
- 醇>
如果静态数据成员是const有效文字类型,则其在类定义中的声明可以指定 一个常量初始化器括号或等于初始化器,带有一个初始化子句,它是一个整型常量表达式。 有效文字类型的静态数据成员可以在类定义中声明 constexpr说明符;如果是这样,它的声明应指定一个带有initializer子句的常量初始化器括号或等于初始化器,该子句是一个整型常量表达式。在这两种情况下,成员可能出现在整数常量表达式中。如果在程序中使用该成员,并且命名空间范围定义不包含初始化程序,则该成员仍应在命名空间作用域中定义。
26. a.getY();
27. A::getY();
非法引用非静态成员A::z
。
通过第一次观察来照顾。
28. B b;
29. C c;
30. C::getY();
getY()
是B
的私人成员,C
无法看到,更不用说是公开了。
31. b.x();
从x()
继承的成员函数A
是私有的。
答案 1 :(得分:0)
是的,这是正确的,尽管您可以使用任意数量的在线C ++编译器进行编译来验证。
答案 2 :(得分:0)
你是对的(虽然它实际上意味着所有 A 的方法都无法访问)。
但是,还有一些其他问题:
A::x() // will not work as x is not static.
a.getY() // will not work as getY() is static.
C::getY() // Cannot access getY()