Вызов конструктора базового класса - PullRequest
4 голосов
/ 25 апреля 2010

В приведенной ниже программе есть строка

Derived(double y): Base(), y_(y)

правильный / разрешено? То есть он соответствует правилам ANSI?

#include <iostream>

class Base
{
 public:
  Base(): x_(0)
  {
   std::cout << "Base default constructor called" << std::endl;
  }
  Base(int x): x_(x)
  {
   std::cout << "Base constructor called with x = " << x << std::endl;
  }

  void display() const
  {
   std::cout << x_ << std::endl;
  }

 protected:
  int x_;      
};

class Derived: public Base
{
 public:
  Derived(): Base(1), y_(1.2)
  {
   std::cout << "Derived default constructor called" << std::endl;
  }
  Derived(double y): Base(), y_(y)
  {
   std::cout << "Derived constructor called with y = " << y << std::endl;
  }

  void display() const
  {
   std::cout << Base::x_ << ", " << y_ << std::endl;
  }

 private:
  double y_;      
};

int main()
{
 Base b1;
 b1.display();
 Derived d1;
 d1.display();
 std::cout << std::endl;
 Base b2(-9);
 b2.display();
 Derived d2(-8.7);
 d2.display();

 return 0;
}

Ответы [ 2 ]

5 голосов
/ 25 апреля 2010

Это разрешено, но это бессмысленно, так как компилятор сделает вызов за вас. Боюсь, что сегодня утром я не чувствую желания совершать стандартный трал.

0 голосов
/ 25 апреля 2010

Это правильно, но вызовы конструкторов по умолчанию базового класса не нужны. Предполагая, что вы используете g ++, вы можете использовать следующий флаг: -ansi (<=> -std = c ++ 98)

...