代码中的C ++错误

时间:2009-03-10 16:01:34

标签: c++

我有这段代码(考试中的问题),代码中有很多错误,这里是代码:

 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继承的任何类变为私有?

3 个答案:

答案 0 :(得分:3)

有很多你不能不累。以下是一些:

void incrementY() {y++}

;之后的y++

24.   A::x();

不能通过类名调用非静态成员。

25.   A a;

没有静态成员y的定义。如果yconst,那就没关系。这有点棘手,所以我引用。

  

9.4.2静态数据成员

     
      
  1. 在类定义中声明静态数据成员不是定义,除了cv-qualified void [...]

  2. 之外,它可能是不完整的类型。   
  3. 如果静态数据成员是const有效文字类型,则其在类定义中的声明可以指定   一个常量初始化器括号或等于初始化器,带有一个初始化子句,它是一个整型常量表达式。   有效文字类型的静态数据成员可以在类定义中声明   constexpr说明符;如果是这样,它的声明应指定一个带有initializer子句的常量初始化器括号或等于初始化器,该子句是一个整型常量表达式。在这两种情况下,成员可能出现在整数常量表达式中。如果在程序中使用该成员,并且命名空间范围定义不包含初始化程序,则该成员仍应在命名空间作用域中定义。

  4.   
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()