【发布时间】:2011-05-13 20:24:03
【问题描述】:
我遇到了抽象/虚拟类的问题,这里是问题的复制:
#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: 注意:因为以下虚函数在‘BasicClassB’中是纯函数:
../src/main.cpp:13:注意:虚拟 std::string BaseClassA::getDateTime()
../src/main.cpp:14: 注意: virtual void BaseClassA::Write(std::string, bool)
../src/main.cpp:15:注意:虚拟布尔 BaseClassA::CheckFile()
../src/main.cpp:16:注意:虚拟布尔 BaseClassA::OpenFile(std::string)
../src/main.cpp:17: 注意:virtual void BaseClassA::CloseFile()
也许我在这里漏掉了重点,但是 BaseClassA(即 BasicClassA)的实现应该包含这些函数,并且由于 BasicClassB 也是 BasicClassA 的子类,它也应该包含这些函数?
我错过了什么?我应该怎么做才能编译?
[编辑]
I updated the class names as suggested by the comment
澄清一下:我在 A 类中使用纯虚拟来强制任何子级实现这些功能。
似乎虚拟继承是我需要的,但是,在我的情况下,我似乎没有得到正确的方法来做到这一点......
目标是有几个“基”类,有点像接口,强制子类实现函数,但它们的任何子类都应该继承被覆盖的函数(就像虚拟继承一样)
但是,使用任意组合 类任何:公共虚拟任何其他{} 不起作用并且总是给出相同的编译错误(上面的那个)。也许我需要改变的不仅仅是继承中的虚拟?
【问题讨论】:
-
可能会更好地调用类 A B C D,因为当前的名称非常混乱。
标签: c++ compilation virtual abstract-class