2015-04-17 3 views
4

Преобразование базы в производную строку требует явного литья, хотя либо static_cast, либо dynamic_cast. Когда база виртуальна, применяется только последняя. Кроме того, dynamic_cast может использоваться только для полиморфных типов. Вместе они, кажется, предполагают, что практически невозможно преобразовать виртуальную базу в производную, учитывая, что вовлеченный тип не является полиморфным. Это правда?Виртуальная основа для производного литья не полиморфного типа

+1

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

+0

@KerrekSB Я думаю, что без RTTI такой бросок невозможно даже в теории. Чтобы включить такой листинг, C++ должен генерировать RTTI также для не-полиморфных типов. Такое бремя :( – Lingxi

ответ

-1

Динамические/статические приведения применяются только к указателям и ссылкам.

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

class Base { 
public: 
    virtual ~Base() {}; 
}; 

class Derived : public Base { 
}; 

int main(int argc, char **argv) 
{ 
    Base *b = nullptr; 
    Derived *d = nullptr; 
    d = dynamic_cast<Derived *>(b); 
    d = static_cast<Derived *>(b); 

    return 0; 
} 

Вторая часть вопроса: если база является виртуальной, производный тип является полиморфным. Что вы имеете в виду?

+3

Под словом virtual я принимаю значение виртуального наследования, а не виртуальных методов. – Lingxi

2

Ваша интерпретация стандарта представляется правильной.

Однако я согласен с тем, что это не имеет значения, потому что ваша гипотетическая виртуальная база с не виртуальным деструктором - это катастрофа, ожидающая, когда кто-то попытается полиморфно удалить ее и наведет неопределенное поведение, поскольку деструктор невиртуальном.

+0

Рассмотрим случай 'void UseIt (const Base & base);' 'delete & base' не имеет смысла. – Lingxi

+1

@Lingxi: что все объекты 'UseIt' знают, что существует объект неполиморфного типа' Base'. Такой объект по дизайну не предоставляет никаких возможностей для определения того, является ли он динамическим (виртуальным) подобъектом, 'UseIt' не может пытаться выполнить такое определение. –