【发布时间】:2017-01-19 17:22:41
【问题描述】:
Given 是一个抽象类AbstractParentPrinter(即带有纯虚函数):
class AbstractParentPrinter {
public:
virtual void print() = 0;
};
AbstractPrinter 是AbstractParentPrinter 的(抽象)子类:
template<typename T, typename = std::enable_if<std::is_base_of<AbstractPrinterStore, T>::value>>
class AbstractPrinter : public AbstractParentPrinter {
protected:
T& getPrinterStore() {
return printerStore;
}
private:
static T printerStore;
};
template<typename T>
T AbstractPrinter <T>::printerStore;
PrinterA 是AbstractPrinter<PrinterStoreA> 的子类。 PrinterStoreA 是 AbstractPrinterStore 的子类(未显示)。
class PrinterA : public AbstractPrinter<PrinterStoreA> {
public:
void print() {
// Do something with PrinterStoreA and print
// An AbstractPrinterStore here instead would be not sufficient
std::cout << "Printer A has printed!" << std::endl;
}
};
由于AbstractPrinter<T>(与AbstractParentPrinter 合并)无法存储在std::vector 中,因此我为此创建了一个父非模板类AbstractPrinter。除了AbstractPrinter 之外,如何防止从AbstractParentPrinter 派生?
【问题讨论】:
-
你真的需要吗?可能有一些非常高级的模板技巧可以让你做到这一点,但是否真的值得为此添加大量其他无用、难以破译的样板代码?
-
如果这个抽象类只能由一个类派生,那么它的意义何在?为什么不合并两者?
-
@antred 我添加了额外的代码/上下文来为我的问题提供动力。
-
@RedX 如果我合并 AbstractParentPrinter 和 AbstractPrinter 我会得到一个模板类,它不能存储在 std::vector 中(见我问题的最后一段)。
-
也许只是写一个不要从
AbstractParentPrinter继承的评论以及为什么,这样你将来和其他维护这个代码的人都会知道发生了什么
标签: c++ templates inheritance abstract-class derived-class