Упростите, упростите, упростите. Кроме того, в наши дни старайтесь не использовать плавающие элементы для макета, если только вам это не нужно, и вы не понимаете, что происходит с элементом, когда вы это делаете.
body {
display: flex;
flex-direction: column;
min-height: 100vh; /* For flex-grow for .content to stretch page height. */
margin: 0;
}
.content {
display: flex;
flex-grow: 1;
}
main {
flex-grow: 1;
}
/* Demo styles */
header,
footer {
background-color: whitesmoke;
}
aside {
background-color: cornsilk;
}
main {
background-color: aliceblue;
}
<header>Header</header>
<div class="content">
<aside class="left-sidebar">
Left Aside
</aside>
<main>
Main
</main>
<aside class="right-sidebar">
Right Aside
</aside>
</div>
<footer>Footer</footer>
Ответы
Я бы назвал оба эти варианта использования динамического связывания. В C ++ язык предоставляет вам механизм, так что вам не нужно катать свой собственный, как вы делаете в C.
(однажды я работал с приложением, в котором каждый крупный объект передавался в сопровождении struct
, чьи поля были функциональными указателями. Цель структуры состояла в том, чтобы позволить приложению реализовать динамическое связывание во время выполнения - то есть изменить назначенные функции для объекта во время выполнения, в зависимости от Насколько я знаю, эта "особенность" никогда не использовалась.
Вы путаете концепцию динамического связывания с реализацией. Динамическое связывание, то есть выбор метода для вызова на основе типа принимающего объекта, может быть реализовано с использованием некоторой формы динамической диспетчеризации, например your (1), но мы обычно определяем имя, чтобы ссылаться только на ситуацию (2).
Вы пытались написать код на языке Си? Какой компилятор вы использовали для этого? Вы не можете иметь две функции с одинаковым именем на языке C.
Динамическое связывание - это привязка интерфейса к его реализации во время выполнения - любая ситуация, когда программа автоматически решает, какой код вызвать как реализацию интерфейса. Таким образом, вообще говоря, 1) и 2) являются динамическим связыванием, но термин обычно используется только для 2).
Связывание во время соединения (раннее связывание) является противоположностью динамического связывания (позднее связывание). При связывании во время компиляции компилятор / компоновщик точно знает, какой код вызывать, и создает прямой вызов этого кода. В динамическом связывании компилятор / компоновщик этого не знает - точная реализация определяется во время выполнения.