【发布时间】:2016-07-06 18:26:58
【问题描述】:
我有这个,可能有点复杂的类层次结构:
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 似乎不会通过 BS->BCA->BCS->T4->BT4->BI4 链看到重载的 meth() 方法。
但为什么?方法明显可用,C++使用的C3线性化算法应该可以很清楚的找到。
【问题讨论】:
-
吹毛求疵:你的意思是“覆盖”而不是“重载”。
-
多个
virtual继承关系有点矫枉过正。您只需要为基类子对象使用它,否则它们会出现两次或更多次。 -
"little bit complex" o.O 如果名字在任何方面都合理的话,也许不会那么糟糕。
-
"BS->BCA->BCS->T4->BT4->BI4链"先升后降;这不是它的工作原理!
-
虽然您不能这样做,但您仍然可以委托给 BI4(甚至是模板中的 T)。
标签: c++ c++11 virtual-functions linearization