Ромбовидное наследование и чистые виртуальные функции

Обновление цикла foreach PHP следующим образом

foreach($stmt->fetchAll() as $row) 
{

    $data .= '<tr>
        <td style="width:150px;border:1px solid grey;">'. $row['field_id'] .'</td>
        <td style="width:150px;border:1px solid grey;">'. $row['description'] .'</td>
        <td style="width:150px;border:1px solid grey;">'. $row['corner_points'] .'</td>
        <td style="width:150px;border:1px solid grey;">'. $row['damming_level_distance_map'] .'</td>
        <td style="width:150px;border:1px solid grey;">'. $row['pipeline_distance_map'] .'</td>
        <td style="width:150px;border:1px solid grey;">'. $row['notes'] .'</td>                    
    </tr>';

}
7
задан Brian Tompsett - 汤莱恩 16 September 2016 в 10:43
поделиться

2 ответа

... Отметьте, Herb Sutter написал 3 превосходных статьи о множественном наследовании (1) здесь, (2) здесь и (3) здесь. Он записал целый другой набор полезных статей в guru-of-the-week здесь. Наиболее рекомендуемый...

Во-первых, я не уверен, что разбираюсь в Вашей иерархии. Я беру его, это похоже на это:

struct A {
    virtual void F() = 0;
};

struct B : A { void F() { } };
struct C : A { };
struct D : B, C { };

Ну, D абстрактен, потому что существует два A подобъекты в объекте типа D: Тот, который сделан конкретным B через решетку B и ту, которая все еще абстрактна в прохождении через решетки C. Я беру его, у Вас есть указатель на D и попытайтесь звонить F. Да, неоднозначность возникает, потому что компилятор находит две функции F в двух отдельных решетках:

D -> B::F
D -> C -> A::F

Сходство с этим:

    F()   F()
     A     A
     |     |
 F() B     C
      \   /
        D 

Можно зафиксировать ту ситуацию официально путем получения из фактически:

struct B : virtual A { void F() { } };
struct C : virtual A { };
struct D : B, C { };

У Вас затем есть эта ситуация, названная ромбовидным наследованием:

       F()  
        A
      /   \
 F() B     C
      \   /
        D 

И делая поиск, это находит, что существует B::F переопределение A::F. Хотя A::F может все еще быть достигнут через D::C::A, это больше не неоднозначность, потому что A был наследован виртуальный.

Является ли это правильным решением в Вашей конкретной проблеме - это, конечно, не бесспорно. Чаще всего существуют лучшие пути, чем получение виртуального от класса. К Вашему вопросу о слиянии таблиц виртуальной функции - это полностью в зависимости от реализации. GCC, насколько я знаю, сохранит указатель на тот экземпляром в виртуальной таблице D, если мы происходим виртуальный.

19
ответ дан 6 December 2019 в 08:17
поделиться

Действительно ли это - правильное решение для проблемы?

"Ромбовидное" наследование проблематично, и корректное объяснение решения берет немного объяснения. Я рекомендую прочитать следующие главы Эффективного C++ Meyers':

  • Объект 26, Примите меры против потенциальной неоднозначности
  • Объект 43, множественное наследование Использования рассудительно.
3
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: