У меня проблема с абстрактными / виртуальными классами, повторение проблемы здесь:
#include <iostream>
class A
{
protected:
virtual std::string getDateTime() = 0;
virtual void Write(std::string data, bool addDate) = 0;
virtual bool CheckFile() = 0;
virtual bool OpenFile(std::string path) = 0;
virtual void CloseFile() = 0;
};
class B
: public A
{
public:
virtual std::string ToString() { return ""; };
virtual void Write(std::string data) { };
};
class C
: public A
{
protected:
std::string getDateTime()
{
return "TODAY";
};
void Write(std::string data, bool addDate)
{
std::cout << "BasicClassA Write" << std::endl;
};
bool CheckFile()
{
std::cout << "BasicClassA CheckFile" << std::endl;
return true;
};
bool OpenFile(std::string path)
{
std::cout << "BasicClassA OpenFile" << std::endl;
return true;
};
void CloseFile()
{
std::cout << "BasicClassA CloseFile" << std::endl;
};
};
class D
: public B,
public C
{
public:
BasicClassB();
virtual ~BasicClassB();
std::string ToString()
{
return "BasicClassB tostring";
};
void Write(std::string data)
{
std::cout << "BasicClassB Write" << std::endl;
};
};
int main(int ac, char *av[])
{
BasicClassB b;
std::cout << b.ToString() << std::endl;
b.Write("");
return 0;
}
Это ошибка компиляции:
.. / src / main.cpp: В функции «int main (int, char **)»:
../src/main.cpp:82: ошибка: невозможно объявить переменную "b" абстрактного типа "BasicClassB"
../src/main.cpp:64: note: потому что следующие виртуальные функции являются чистыми в BasicClassB:
../src/main.cpp:13: note: virtual std :: string BaseClassA :: getDateTime ()
../src/main.cpp:14: примечание: виртуальная пустота BaseClassA :: Write (std :: string, bool)
../src/main.cpp:15: примечание: виртуальный bool BaseClassA :: CheckFile ()
../src/main.cpp:16: примечание: виртуальный bool BaseClassA :: OpenFile (std :: string)
../src/main.cpp:17: примечание: виртуальная пустота BaseClassA :: CloseFile ()
Возможно, я здесь упускаю суть, но реализация BaseClassA (будучи BasicClassA) должна содержать эти функции, и, поскольку BasicClassB также является подклассом от BasicClassA, он также должен содержать эти функции?
Что мне не хватает? Что я должен сделать, чтобы сделать эту компиляцию?
[ редактировать ]
I updated the class names as suggested by the comment
Для пояснения: я использовал чистый виртуальный в классе A, чтобы принудительно заставить дочерних элементов реализовывать функции.
Кажется, виртуальное наследование - это то, что мне нужно, однако я, похоже, не понимаю, как это сделать в моем случае ...
Цель состоит в том, чтобы иметь несколько «базовых» классов, вроде интерфейсов, вынуждающих дочерние элементы реализовывать функции, но любые дочерние классы должны наследовать переопределенную функцию (так же, как виртуальное наследование)
Однако, используя любую комбинацию
класс Any: общедоступный виртуальный Anyother {}
не получается и всегда выдает одну и ту же ошибку компиляции (ту, что выше). Возможно, мне нужно изменить больше, чем просто виртуальный в наследство?