C++ разница между virtual = 0; и пустой функцией
теперь я изучаю C++, сторону OO, и я получил это все время:
class SomeClass{
virtual void aMethod()=0;
}
class AnotherClass{
void anotherMethod(){/*Empty*/}
}
class SomeClassSon : public SomeClass{
void aMethod(){/*Also Empty*/}
}
мое сомнение: в чем разница между 3 методами. Виртуальное равно нулю, пустое и виртуальное, поскольку оно наследуется, пустое.
почему я не могу просто сделать метод SomeClassSon, как отец?(виртуальная пустота равна нулю?)
6 ответов
для
class SomeClass{
virtual void aMethod()=0;
}
в наличии чисто виртуальный метод делает ваш класс аннотация. Как только у вас есть один такой чистый виртуальный метод,=0
в вашем классе, вы не можете создать экземпляр класса. Более того, любой производный класс должен реализовать чисто виртуальную aMethod()
, или он также становится абстрактным классом.
в производном классе вы перезаписываете чистый виртуальный метод сверху, и это делает производный класс не абстрактный. Можно создать экземпляр этого производного класса.
но, в производном классе метода является пустым, верно? Поэтому ваш вопрос имеет смысл: почему бы не сделать класс чисто виртуальный. Ну, ваш класс может повлечь за собой другие методы. Если так, то SomeClass
невозможно создать экземпляр (существует чистый виртуальный метод), тогда как дочерний класс SomeClassSon
может быть.
то же самое относится к вашему AnotherClass
, который может быть создан, вопреки SomeClass
.
разница в том, что virtual void aMethod() = 0
Это чисто виртуальная функция, это означает, что:
-
SomeClass
становится абстрактным базовым классом, это означает, что его нельзя создать. - любой класс, который наследует от
SomeClass
необходимо реализоватьaMethod
, или он тоже становится абстрактным базовым классом, который не может быть создан
обратите внимание, что любой класс с одной или несколькими чисто виртуальными функциями автоматически абстрактный базовый класс.
"равно 0", на которое вы ссылаетесь, называется"чисто виртуальные". Это функция, которую ребенок, который хочет создать экземпляр, должен реализовать, а не предоставлять базовую функциональность, что означает, что родительский класс будет определять функциональность, которая должна существовать, но что родитель не знает, как ребенок будет это делать. Обратите внимание, что это делает класс абстрактным в том, что он не может быть создан. Например, я могу определить класс" Mammal", который я могу наследовать от и я хочу, чтобы его дети действовали определенным образом - но я не могу просто сделать "млекопитающее". Вместо этого я бы создал класс "жираф" и убедился, что он действует так, как должен.
Это также объясняется на этом так вопрос.
"пустая" функция, на которую вы ссылаетесь, - это функциональность, где функция определена и может быть вызвана, но ничего не делает.
объявление aMethod ()=0 сообщает компилятору, что этот метод должен быть предоставлен в подклассах. Любой подкласс, который не реализует метод, не может быть создан. Это поможет вам гарантировать, что любые объекты базового класса будут иметь реализованный метод.
чисто virtual
делает класс абстрактным. Пустой не виртуальный метод ничего не делает - он просто приводит к ошибке компоновщика, если вы пытаетесь его вызвать. Напротив, вы не можете попытаться вызвать pure virtual
(Если вы не попытаетесь вызвать его из конструктора, что все равно плохо), потому что компилятор не позволит вам создать этот объект.
есть также логическое различие-метод с пометкой virtual
будет виртуальным через цепочку наследования - остальные просто регулярные методы.
чистая виртуальная функция (ваш первый пример, с =0
) означает, что функция должна быть переопределена в производном классе для создания экземпляра объекта этого класса.
второй-это просто функция-член, которая ничего не делает. Поскольку функция имеет другое имя, А класс не связан с SomeClass
, не влияют друг на друга.
третий переопределяет чистую виртуальную функцию, поэтому можно создать экземпляр SomeClassSon
, но и в производный класс переопределенная функция ничего не делает.