2

У меня есть 3 классов A, B, и C:Создать абстрактный класс без абстрактного метода

class A 
{ 
/// Some Code 
}; 

class B : public A 
{ 
/// Some Code 
}; 

class c : public B 
{ 
/// Some Code 
}; 

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

+4

Создайте чистый виртуальный деструктор. Или разрешить только защищенные конструкторы. –

+0

Скорее всего, вам не нужно наследование классов вообще. Вместо этого рассмотрите отношения HAS-A. –

ответ

2

Коэффициенты, если вы используете классы в качестве базовых классов, как показано в примере кода, они должны иметь виртуальные деструкторы. И поскольку деструктор - это метод, вы можете сделать это чистым виртуальным («абстрактным») деструктором, чтобы сделать сам класс «абстрактным».

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

class A 
{ 
    public: 
    virtual ~A() = 0; 

/// Some Code 
}; 

class B : public A 
{ 
    public: 
    virtual ~B() = 0; 

/// Some Code 
}; 

class C : public B 
{ 
    public: 
    virtual ~C() = 0; 

/// Some Code 
}; 
A::~A() { } 
B::~B() { } 
C::~C() { } 

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

Это должно дать вам желаемый эффект. Тем не менее, я в настоящее время изо всех сил стараюсь придумать привлекательное приложение для этого дизайна. Вся цель абстрактного класса в C++ заключается в определении интерфейса , и вы не можете иметь интерфейс, если только не определены методы, которые составляют этот интерфейс. Либо я просто недостаточно умный, или вы должны переосмыслить свой дизайн.

+0

Почему вы создали деструктор C как чистый виртуальный? –

+0

Ему не нужен чистый виртуальный, если 'C' не должен быть абстрактным. Это было непонятно из вашего вопроса, @. И хотя 'virtual' подразумевается для деструктора, когда вы наследуете базовый класс с виртуальным деструктором, мне все равно хочется включить его для ясности. –