Не вызывать конструктор базового класса из производного класса

Скажем, у меня есть базовый класс:

class baseClass  
{  
  public:  
baseClass() { };

};

И производный класс:

class derClass : public baseClass
    {  
      public:  
    derClass() { };

    };

Когда я создаю экземпляр derClass, вызывается конструктор baseClass. Как я могу предотвратить это?


person Brad    schedule 31.10.2010    source источник
comment
Вы не; это не имеет смысла. Как вы думаете, почему вам нужно это делать?   -  person GManNickG    schedule 01.11.2010
comment
@GMan У меня есть базовый класс, в котором данные подготавливаются с заголовком в конструкторе. Производному классу не нужен подготовленный заголовок, но он вызывает конструктор базового класса, который готовит заголовок и кое-что портит.   -  person Brad    schedule 01.11.2010
comment
Вы упускаете момент наследования. Наследование формирует отношения типа А-В. Если Б делает то, чего не должен делать А, то А не Б.   -  person Benjamin Lindley    schedule 01.11.2010
comment
Прочтите это. Спрашивайте о всей проблеме, которую вы пытаетесь решить, а не о шаге, который, по вашему мнению, вам нужно предпринять.   -  person GManNickG    schedule 01.11.2010
comment
изменить базовый класс, а не производный класс.   -  person Dialecticus    schedule 01.11.2010


Ответы (3)


Создайте дополнительный пустой конструктор.

struct noprapere_tag {};

class baseClass  
{  
public:  
  baseClass() : x (5), y(6) { };

  baseClass(noprapere_tag) { }; // nothing to do

protected:
  int x;
  int y;

};

class derClass : public baseClass
{  
public:  
    derClass() : baseClass (noprapere_tag) { };

};
person Alexey Malistov    schedule 31.10.2010
comment
›derClass() : baseClass (noprapere_tag) { }; В этой строке noprapere_tag не является объектом, не должны ли вы создать объект? - person Abhishek Agarwal; 09.02.2019

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

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

person CB Bailey    schedule 31.10.2010

Пример рабочей программы

#include <iostream>

using namespace std;
class A
{
    public:
    A()
    {
        cout<<"a\n";
    }
    A(int a)
    {}
};
class B:public A
{
    public:
    B() : A(10)
    {
        cout<<"b\n";
    }
   
};
int main()
{
    
    new A;
    cout<<"----------\n";
    new B;
    
    return 0;
}

вывод

a                                                                                                        
----------                                                                                               
b   
person Sathvik    schedule 27.06.2020