Я смущен тем, как переопределять функции, если у меня есть
class C
{
public:
C ();
};
class A: public C
{
public:
virtual string write()=0;
};
и я делаю еще один класс
class B: public A
{
public:
string B :: write() override {}
};
это недопустимо для класса B, наследующего класс A, и его переопределения?
нормально, так что в основном, мне не позволено называть конструкторы для этого абстрактного класса правильными? Но если этот абстрактный класс имеет конструктор, который он унаследовал, как я их называю?
void main()
{
B();
}
это недопустимо для класса B, наследующего класс A, и его переопределения?
Вам нужно сбросить избыточные (и незаконные) B::
и вернуть что-то. В противном случае это нормально.
Мне не позволено называть конструкторы для этого абстрактного класса правильными? Но если этот абстрактный класс имеет конструктор, который он унаследовал, как я их называю?
Вы не можете напрямую ссылаться на конструкторы; это не то, как работает язык. Конструкторы называются косвенно при создании объекта:
B b; // Create an instance of B, indirectly calling B::B(), which calls A::A()
Поскольку A
является абстрактным, вы не можете создать объект этого типа; только таких производных типов, как B
которые перекрывают все чистые виртуальные функции.
B
имеет неявный конструктор, который вызывает (неявный) конструктор A
, который вызывает конструктор C
Таким образом, создание объекта типа B
правильно инициализирует его подобъект C
своим конструктором.
Если вы хотите указать override
(доступно на С++ 11) здесь, вы можете сделать это следующим образом.
Файл заголовка
class B : public A {
public:
virtual string Write() override;
}
CPP файл
string B::Write() {
// Your implementation here.
}
На самом деле, это хорошая практика, чтобы указать override
когда это ваше фактическое намерение. Он избегает ошибки, такой как попытка переопределить string A::Write()
со string B::Write() const
, но получить результат определения второй функции. В этом случае, если вы укажете string B::Write() const override
, это будет ошибка компиляции.
Синтаксис для наследования из другого класса должен выглядеть примерно так:
class B: public A{
public:
virtual string write(){
//do something
return someString;
}
};