C ++: вопрос списка инициализатора новичка - PullRequest
3 голосов
/ 03 декабря 2009

Новичок здесь. Я смотрю на балансовую единицу.

Похоже, что в классе A нет переменных-членов, но в конструкторе A он инициализирует объект B, даже если класс A не содержит никакой переменной-члена типа B (или вообще никакой переменной-члена!)

Полагаю, я не понимаю этого достаточно, чтобы даже задать вопрос ... так что здесь происходит? Моя интуиция заключается в том, что вам нужна переменная, прежде чем вы даже попытаетесь ее инициализировать. Как можно (или что хорошего это дает) инициализировать объект, не имея объекта?

.h:

class A: public B
{
public:
     A(bool r = true);
     virtual ~A;

private:
}

.cpp:

A::A(bool r) : B(r ? B::someEnumeration : B::anotherEnumeration)
{
}

A::~A()
{
}

Пожалуйста, помогите.

Спасибо, JBU

Ответы [ 5 ]

9 голосов
/ 03 декабря 2009

Класс A (публично) наследует от класса B:

class A: public B

Единственный способ инициализации базового класса с параметрами - через список инициализаторов.

0 голосов
/ 03 декабря 2009
class A: public B
{
public:
     A(bool r = true); // defaults parameter 1 as "true" if no arguments provided ex A *pA = new A();
     virtual ~A;

private:
}

.cpp

A::A(bool r) : B(r ? B::someEnumeration : B::anotherEnumeration)
{
  // calls parent class, and initialize argument 1 with some enumeration based on whether r is true or false
}

A::~A()
{
}
0 голосов
/ 03 декабря 2009

Поскольку construtor не может наследоваться, поэтому члены данных базового класса должны быть инициализированы путем передачи аргумента в конструктор производного класса и с помощью списка инициализации.

Вы также должны знать, что в случае полиморфного класса инициализация vptr для соответствующей виртуальной таблицы выполняется только в конструкторе.

0 голосов
/ 03 декабря 2009
class A : public B
{
};

class B
{
  public:
  int x;
};

A является производным от B. Или A наследует B.

Так что это действительно ...

A a;
a.x = 3;

Остальная часть вашего кода просто вызывает конструктор B, когда конструируется A.

0 голосов
/ 03 декабря 2009

На самом деле это единственный способ вызвать ctor базового класса в C ++, поскольку нет такой вещи, как super().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...