у меня есть это, может быть, немного сложной иерархии классов:Почему чистые виртуальные методы не переопределяются из другой ветви наследования?
class BS {
public:
virtual void meth()=0;
};
class BCA : public virtual BS {
};
class BSS : public virtual BS {
};
class BCS : public virtual BCA, public virtual BSS {
};
class BI4 {
public:
void meth() {};
};
class BT4 : public virtual BI4, public virtual BSS {
};
class T4 : public virtual BCS, public virtual BT4 {
};
int main() {
T4 t4;
};
Теперь проблема заключается в том, что хотя void meth()
доступен в наследство графа, несмотря на этот код не будет компилироваться:
$ g++ -c t.cc -std=c++11
t.cc: In function ‘int main()’:
t.cc:27:6: error: cannot declare variable ‘t4’ to be of abstract type ‘T4’
T4 t4;
^
t.cc:23:7: note: because the following virtual functions are pure within ‘T4’:
class T4 : public virtual BCS, public virtual BT4 {
^
t.cc:3:18: note: virtual void BS::meth()
virtual void meth()=0;
^
t.cc:3:18: note: virtual void BS::meth()
Мне кажется, что BS
как-то не увидит перегруженный метод meth()
через цепь BS-> BCA-> BCS-> T4-> BT4-> BI4.
Но почему? Этот метод явно доступен, алгоритм линеаризации C3, используемый C++, должен иметь возможность очень четко его находить.
Nitpick: вы имеете в виду «переопределенный», а не «перегруженный». – Thomas
Несколько «виртуальных» отношений наследования немного переборщиваются. Вам нужно только это для под-объектов базового класса, которые в противном случае возникали бы два или более раз. –
«немного сложный» o.O Это было бы не так уж плохо, если бы имена были в любом случае разумными. –