Если базовый класс Base
, а производный класс Der
, вы можете иметь указатель Base *p
, который фактически указывает на экземпляр Der
. Когда вы вызываете p->foo();
, если foo
не является виртуальным, то выполняется его версия Base
, игнорируя тот факт, что p
фактически указывает на Der
. Если foo является виртуальным, p->foo()
выполняет «верхнее» переопределение foo
, полностью принимая во внимание фактический класс заостренного элемента. Таким образом, разница между виртуальным и не виртуальным на самом деле очень важна: первая позволяет использовать полиморфизм , основную концепцию программирования OO, в то время как последняя не делает.
Проблема связана с положением вашего <script> .. </script>
в документе html.
Элемент body
еще не существует в момент выполнения вашего скрипта. Это означает, что d3.select("body")
будет пустым и не будет добавлено div.chart
.
Попробуйте переместить <script> .. </script>
внутри части <body> .. </body>
. Это гарантирует, что элемент body
существует, когда ваш код выполняется.
Если вы не хотите помещать теги <script>
в элемент <body>
, вы также можете сообщить браузеру выполнить ваш код d3 (или любой другой код JavaScript) после готовности DOM.
Используя библиотеку, такую как jQuery, вы можете использовать:
$( document ).ready(function() {
// Your d3 code here
});
Это гарантирует, что ваши скрипты будут выполнены после того, как будет готов весь DOM, включая элемент <body>
.
Для справки, примеры и более короткая версия функции jQuery ready, см. http://learn.jquery.com/using-jquery-core/document-ready/ .
Использование внутри тела делает его недоступным только для тега или любого из них, но также выполняет его быстрее. Кроме того, как div является тегом u, можно создать класс, например. один, а затем использовать его как d3.select (". one"), чтобы он не совпал.