Как я могу убедиться, что у класса нет виртуальных методов? - PullRequest
1 голос
/ 14 сентября 2010

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

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

Решения не обязательно должны соответствовать стандартам, достаточно, если они работают на gcc-4.2 или MSVC от Apple.

Как мне этого добиться?

Ответы [ 3 ]

9 голосов
/ 14 сентября 2010

Ну, я действительно думаю, что это не имеет смысла применять, но вы могли бы использовать черты типа повышения 'is_polymorphic.

РЕДАКТИРОВАТЬ: Пример:

#include <iostream>
#include <boost/type_traits.hpp>

struct Base
{
    virtual void MyMethod() { std::cout << "My method called."; }
    virtual ~Base() {}
};

class Derived : Base
{
    virtual void MyMethod() { std::cout << "Derived"; }
};

struct POD
{
    int data;
};

int main()
{
    std::cout << boost::is_polymorphic<Base>::value << std::endl;
    std::cout << boost::is_polymorphic<Derived>::value << std::endl;
    std::cout << boost::is_polymorphic<POD>::value << std::endl;
}

//Output is
// 1
// 1
// 0
// 
1 голос
/ 14 сентября 2010

Добавьте в свой источник контроля правило, которое отклоняет регистрацию, содержащую слово «virtual», отправляет электронное письмо старшему разработчику и фиксирует оплату нарушающей стороной.

0 голосов
/ 14 сентября 2010

Что бы произошло, если бы вы создали исходный модуль, который содержал класс с тем же именем, что и тот, в котором виртуальные методы были запрещены, и этот класс содержал виртуальный метод, но не имел других методов, чьи имена скрывали имена другого класса? Какие глобальные символы создаст этот класс? Я ожидал бы, что если два класса с одинаковыми именами существуют, но не имеют ничего общего, компоновщик, вероятно, не закричит, но если оба класса имеют vtable, компоновщик может зарегистрировать конфликт. Будет ли это действительно регистрировать конфликт, будет зависеть от используемых правил искажения имен.

...