2014-01-25 3 views
3

Мы не можем создать объект абстрактного класса. И конструкторы создают новые экземпляры любого класса, который вызывается как объект.Существует ли «Конструктор абстрактного класса»?

Это то, что я знаю об отношениях между конструктором, классом и объектом.

Пожалуйста, исправьте меня, если я ошибаюсь.

+2

Существует ли объект абстрактного класса? ты пробовал? –

+0

что я прочитал, абстрактный класс не может иметь объект. – Priyanka

+0

Напишите конструктор и посмотрите, согласен ли его компилятор. –

ответ

4

Он существует?

#include <iostream> 

class A 
{ 
public: 
    virtual void f() = 0; 
    A() 
    { 
     std::cout << "Yes it does!" << std::endl; 
    } 
}; 

class B: public A 
{ 
public: 
    void f() {} 
}; 

int main() 
{ 
    B b; 
    return 0; 
} 

Да, это делает!

Техническая причина в том, что кому-то необходимо инициализировать элементы A, и это задание конструктора. Но вы можете легко рассуждать так:

Отношение наследования часто называется «есть». Например, объект типа B также имеет тип A. Другими словами B является своего рода A. Конструктор A строит объект типа A. Но b выше также является видом A, поэтому A должен иметь конструктор, чтобы иметь возможность его построить.

+0

конструктор инициализирует членов класса ?? означает, что у меня есть класс A {int x;}; и если в функции main(), если я создаю объект класса A, A b; x станет нулевым? или оставаться неинтеллизированным? – Priyanka

+1

@Priyanka: оставаться неинициализированным, работа ** конструктора ** заключается в инициализации членов, но ваша ** ответственность за то, чтобы она выполняла свою работу. –

2

Существует ли «Конструктор абстрактного класса»?

Предположим, что может существовать абстрактный конструктор классов. Как и любой другой класс. По умолчанию (если вы не объявляете «настраиваемый» конструктор или у вас нет объектов-членов, которые не имеют конструктора по умолчанию), существуют два неявно определенных: конструктор по умолчанию и конструктор копирования .

Таким образом, в декларации, как это:

struct abstract_class { 
    virtual void func() = 0; 
} 

вы до сих пор конструкторами.


Мы не можем создать объект абстрактного класса.

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


И конструкторы создают новые экземпляры любого класса, который называется объектом.

Я бы перефразировал это так: вы строите объекты типа класса через их конструктор. И да, в C++ объект (из §1.8/1):

Объект является областью хранения.

И все. Например:

int x = 0; 

также является объектом. Объект не обязательно означает тип класса.

+2

Этот ответ имеет некоторое терпение +1 –

2

Да! Он должен существовать, поскольку конструкторы любого дочернего класса обращаются к базовому конструктору. (Это самый простой способ объяснить это)

1

Абстрактные классы могут содержать переменные-члены и инициализировать эти переменные-члены Абстрактные классы нуждаются в конструкторе.

Смежные вопросы