Проблема наследственного поведения - PullRequest
1 голос
/ 30 сентября 2011

Я читал о наследовании, но у меня все еще нет ясности на 100%, вот мой вопрос: у меня, например, класс, полный вещей:

class Something
{
  public:
    Something();
    Something(int A);
    Something(Something S);
    ~Something();

    Something& operator=(const Something & s);
    Something operator+(const Something & s) const;
    // more methods ...
  protected:
    int A,B,C;
}

Все методы реализованы где-то, и теперь я просто хочу, чтобы новый класс добавил еще один атрибут и, возможно, один метод, но я все еще хочу такое же поведение, как и в SuperClass (конструктор, деструктор, методы, операторы), поэтому я делаю что-то вроде этого:

class SomethingMore : public Something
{
  public:
    void OnlyMethodHere();
  private:
    int D;
}

Но я получаю что-то вроде:

undefined reference to SomethingMore::SomethingMore(int)

Можно ли сказать компилятору использовать все так же, как в суперклассе, или мне нужно сделать суперкласс:: method () в методе каждого ребенка?

Ответы [ 3 ]

4 голосов
/ 30 сентября 2011

Вам не нужно повторять для методов.но для конструктора вы должны правильно определить их в подклассе.В любом случае, код - это котельная плита, если у вас нет ничего лишнего.

SomethingMore::SomethingMore(int i_):Something(i_)
{
}
0 голосов
/ 30 сентября 2011

Вы можете получить тот же эффект, что и в этом ответе , в C ++ 0x с помощью своего рода универсального конструктора:

class SomethingMore
{
public:
    .......
    template<class... Args>
    SomethingMore(Args&&... args) : Something(std::forward<Args>(args...)) {}
}
0 голосов
/ 30 сентября 2011

В c ++ 0x это можно сделать:

class BaseClass
{
public:
  BaseClass(int iValue);
};

class DerivedClass : public BaseClass
{
public:
  using default BaseClass;
};

, но я не знаю ни одного компилятора, который бы его поддерживал.Если вы хотите сохранить совместимость со старыми компиляторами, вы должны повторить все конструкторы в производном классе, например

class BaseClass
{
public:
  BaseClass(int iValue);
};

class  : public BaseClass
{
public:
  DerivedClass(int iValue):BaseClass(iValue){}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...