Как избежать вызова конструктора прародителя в C ++? - PullRequest
2 голосов
/ 19 декабря 2010

Конструктор Child в приведенном ниже коде вызывает его родительский конструктор для инициализации. Однако код не будет компилироваться, если только Child не вызовет конструктор Grandparent, даже если это деталь реализации, которая должна быть скрыта в Parent. Я не хочу раскрывать эту деталь пользователям класса Child, так как она может измениться в будущем. Как я могу получить приведенный ниже код?

Я пытался изменить наследование на «частное», но конструктор Child все еще должен был знать об этом частном порядке, который, по-моему, несколько отрицает цель частного наследования!

Есть предложения?

#include <iostream>

class MyObject {
  public:
    MyObject(int i) {
      std::cout << "MyObject(" << i << ") constructor" << std::endl;
    }
};

class Grandparent {
  public:
    Grandparent(MyObject i)
    {
    };
};

class Parent: virtual public Grandparent {
  public:
    Parent(int j) :
      Grandparent(MyObject(j))
    {
    };
};

class Child: virtual public Parent {
  public:
    Child() :
      //Grandparent(MyObject(123)),  // Won't work without this
      Parent(5)
    {
    };
};

int main(void)
{
  Child c;
  return 0;
}
$ g++ -o test test.cpp
test.cpp: In constructor ‘Child::Child()’:
test.cpp:29: error: no matching function for call to ‘Grandparent::Grandparent()’
test.cpp:12: note: candidates are: Grandparent::Grandparent(MyObject)
test.cpp:10: note:                 Grandparent::Grandparent(const Grandparent&)

Ответы [ 2 ]

5 голосов
/ 19 декабря 2010

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

1 голос
/ 19 декабря 2010

У меня нормально работает, когда удалено виртуальное наследование.

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