У меня есть следующий код:
#include <iostream>
class Grandma
{
public:
virtual void foo() = 0;
};
class Mom : public Grandma{};
class Dad
{
public:
void foo() { std::cout << "dad's foo impl"; }
};
class Me : public Mom, public Dad{};
int main()
{
Me m;
m.foo();
}
и получение: cannot instantiate abstract class
Я знаю, что означает эта ошибка, я знаю, что не могу создать экземпляр бабушки из-за чисто виртуального.
Но почему я не могу создать экземпляр Me, когда компилятор знает, что я унаследован от мамы и папы, а папа реализовал foo
?
Я знаю, что могу исправить это, добавив foo
в Me
и внутри него, например, вызовите Dad::foo
, но я боюсь, что это не решение для моего случая.
Действительно ли необходимо иметь реализацию виртуального метода между его объявлением и созданным объектом (при обходе)"граф иерархии классов")?См. График ASCI
A
|
B1 B2
\ |
C1 C2
| /
|/
D
|
E
Когда я хочу создать экземпляр E и получить виртуальное объявление в A, единственный способ запустить его - определить его в A, B2, C1, D или E?и точно так же, когда виртуальное объявление в C2 является единственным способом, чтобы определить его в C2, D или E?
Я знаю, что это может быть глупый вопрос, но у меня был долгой день, и я не могу больше думать.
Пожалуйста, не отвечайте только с - "Это невозможно", но попробуйте добавить объяснение, почему нет.
Спасибо!
РЕДАКТИРОВАТЬ -foo () в Dad
, конечно, не должен быть приватным