Я пытаюсь реализовать класс контракта в Borland C ++ Builder, но получаю ошибку компиляции, которую я не понимаю. Код выглядит так:
class baseClass2 {
public:
virtual void test () = 0;
};
class derivedClass: public baseClass2 {
derivedClass () {test ();};
};
void baseClass2::test () {
};
Это компилируется, но я верю, что
void baseClass2 :: test ()
должен быть в производном классе. Если я положу это здесь, я получаю
[Ошибка C ++] multiple_inheritance.cpp (33): E2316 ‘outputClass :: test ()’
не является членом производного класса
Почему я это получаю? Спасибо!
void baseClass2 :: test ()
Это неверно, так как вы уже объявили test()
как виртуальная функция в baseClass2
,
должен быть в производном классе
Прежде чем сделать это, вы должны объявить это в derivedClass
определение следующим образом:
class derivedClass: public baseClass2 {
public:
derivedClass () {test ();};
virtual void test();
};
void derivedClass:test() {
}
Тогда вы можете позвонить test()
в вашем производном конструкторе класса.
реализация базового класса test()
чисто виртуальный. Законно предоставлять реализацию в вашем базовом классе, но вы все равно должны предоставить другую в своем производном классе (при условии, что вы хотите DerivedClass быть конкретным классом).
class baseClass2 {
public:
virtual void test () = 0;
};
class derivedClass: public baseClass2 {
public:
derivedClass() { test(); }
void test();
};
void baseClass2::test () {
}
void derivedClass::test () {
}
Это довольно тонко. Если вы получили конструктор следует вызвать функцию, которая была объявлена виртуальной в одном из ваших классов-предков (либо напрямую, либо через другую функцию-член (так что это может быть довольно трудно обнаружить)), затем вы вызовете реализацию в базовом классе. Бывает даже если вы переопределили виртуальную функцию.
Это означает, что в вашем случае derivedClass::derivedClass()
поэтому назову чистым животным baseClass2::test()
, EEEK!
Да, так работает C ++. Производный указатель vtable указывает на базовый класс vtable пока ты в конструкторе. Он обновляется только после выхода из конструктора.