Stefan_Lang
Привет
Для тех, кто новичок не только в C++, но и в C, было бы лучше начать с одного или нескольких учебных пособий. Это поможет вам понять самые важные основы и некоторые базовые программы, которые вы затем можете расширить, чтобы попробовать более продвинутые вещи самостоятельно.
Вот приличный учебник по Cplusplus.com, который также является хорошим справочным сайтом для расширенных языковых функций: Учебник по языку C++
Что касается ваших вопросов:
1. класс, который имеет один или несколько чистый виртуальные функции не могут быть созданы. Это то, что называется (Чистым) виртуальным, или "абстрактным" классом. Обычно вы используете такие классы, если все, что вы хотите сделать, это описать конкретное поведение, а не все определение реального класса, или если вы хотите описать поведение, которое является общим для нескольких связанных классов.
Пример:
// file Shape.h
// class Shape describes some geometric object
// it may be drawn, but how to draw a shape depends on the specific type of shape
// therefore we define this class as pure virtual, and leave the drawing to the
// concrete shape classes:
class Shape {
public:
virtual void draw() = 0; // pure virtual or 'abstract' member function
};
// file Triangle.h
#include "Shape.h" // read declaration of the base class Shape
// class triangle
class Triangle : public Shape {
public:
virtual void draw(); // this function will draw a triangle
};
// file Triangle.cpp
#include "Triangle.h"
// implementation of the Triangle member functions
void Triangle::draw() {
// draw some triangle here ...
}
(а теперь сделайте то же самое для других типов фигур, например круга, квадрата)
// file main.cpp
#include "Shape.h"
#include "Triangle.h"
#include "Circle.h"
#include "Square.h"
int main() {
Shape* shapes[3];
// construct the shape objects
shapes[0] = new Triangle();
shapes[1] = new Square();
shapes[2] = new Circle();
// now draw all shapes:
for (int i = 0; i < 3; ++i) {
shapes[i].draw();
}
// destroy the constructed objects again
for (int i = 0; i < 3; ++i) {
delete shapes[i];
}
return 0;
}
Теперь, если бы вы могли создать экземпляр объекта класса
Shape
и назначьте его своему
shapes
массив, как вы думаете, к чему призыв
draw()
подойдет? - Ты не знаешь? Ну, и компилятор тоже. Вот почему это запрещено.
(остальные вопросы в отдельном решении))