2016-04-28 2 views
-7

Можно ли написать универсальный базовый класс, который все остальные классы (кроме него) публично и практически наследуют? (Есть ли способ обхода gcc?). Было бы предпочтительнее не наследовать явным образом ... потому что я хочу, чтобы материал стандартной библиотеки наследовал от этого тоже ... И это разумно делать?Одна база, чтобы управлять ими всеми. Одна база для их всех и в темноте связывает их

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

+3

Без явного упоминания об этом? Вы из Явы? –

+0

@ LukeLee Без явного указания (и нет, я не из Java) .... Я хочу, чтобы это повлияло даже на стандартную библиотеку – DarthRubik

+2

Что вы пытаетесь выполнить? – Nayuki

ответ

2

Да. Определите класс с общедоступным виртуальным деструктором. Назовите его base.

Теперь после того, как каждый класс foo сделать это:

class foo: 
    public virtual base 

и сделано!

Naturaly это работает только на ваших собственных типах. Если вы хотите применить его к другим типам, например std, просто переопределите std в собственном пространстве имен notstd по типу и наследуйте все типы от base. Аналогично для любых сторонних библиотек, которые вы хотите использовать: некоторые могут оказаться непрактичными.

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

С другой стороны, если вы хотите новый язык, который ведет себя в основном как C++, но заставляет базовый класс для всех классов и дезактивирует классы из structs, рассмотрите .

+0

Но он хочет больше ... –

+0

Чтобы ответить на «более» часть, тайно 'sed' перед' gcc' (путем определения функции), чтобы все наследования наследовать от 'foo' :) – axiom

+0

@axiom Это звучит как человек с опытом в этой области – DarthRubik

6

Пытаться к shoehorn в общей виртуальной базе сильно сломает C++.

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

Даже другие системы, у которых предположительно есть общий базовый класс (например, Microsoft .NET), имеют несколько типов blit-able, для которых наследование из базового класса является удобной ложью - виртуальная отправка не разрешена, все вызовы, относящиеся к унаследованным члены этих классов должны быть разрешены во время компиляции.