C ++ Builder — Реализация контракта в Borland C ++ Builder

Я пытаюсь реализовать класс контракта в 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 ()’
не является членом производного класса

Почему я это получаю? Спасибо!

0

Решение

void baseClass2 :: test ()

Это неверно, так как вы уже объявили test() как виртуальная функция в baseClass2,

должен быть в производном классе

Прежде чем сделать это, вы должны объявить это в derivedClass определение следующим образом:

class derivedClass: public baseClass2 {
public:
derivedClass () {test ();};
virtual void test();
};

void derivedClass:test() {

}

Тогда вы можете позвонить test() в вашем производном конструкторе класса.

0

Другие решения

реализация базового класса test() чисто виртуальный. Законно предоставлять реализацию в вашем базовом классе, но вы все равно должны предоставить другую в своем производном классе (при условии, что вы хотите DerivedClass быть конкретным классом).

class baseClass2 {
public:
virtual void test () = 0;
};

class derivedClass: public baseClass2  {
public:
derivedClass() { test(); }
void test();
};

void baseClass2::test () {
}

void derivedClass::test () {
}
0

Это довольно тонко. Если вы получили конструктор следует вызвать функцию, которая была объявлена ​​виртуальной в одном из ваших классов-предков (либо напрямую, либо через другую функцию-член (так что это может быть довольно трудно обнаружить)), затем вы вызовете реализацию в базовом классе. Бывает даже если вы переопределили виртуальную функцию.

Это означает, что в вашем случае derivedClass::derivedClass() поэтому назову чистым животным baseClass2::test(), EEEK!

Да, так работает C ++. Производный указатель vtable указывает на базовый класс vtable пока ты в конструкторе. Он обновляется только после выхода из конструктора.

0
По вопросам рекламы [email protected]