我有以下类层次结构。
class A {
public:
virtual bool foo() const;
};
class B : public A {
// Redeclare foo as virtual here?
};
class C : public B {
bool foo() const {/*Definition*/ return true;}
};
class D : public B {
bool foo() const {/*Definition*/ return false;}
};
所以C类和D类想要实现的foo()方法,B则没有。我怎样才能做到这一点?我是否必须在类B中将foo()重新声明为虚拟?
注意:忽略此处和那里的轻微语法错误。这不是实际代码。我的问题只是关于这个概念。
答案 0 :(得分:1)
如果您希望派生类实现一个函数,那么在基类中将函数设为pure virtual function
。
如果您只是想让随机派生类重新实现一个函数,那么只需在基类中创建函数virtual
,就像您在示例中所做的那样。
现在,由于函数foo
在基础virtual
中为class A
,因此将为vtable
创建一个虚拟表class A
,并直接派生所有类或间接来自class A
。
虚拟函数条目存储在vtable
中,如果它们在后续派生类中重新实现,它们只会在vtable
中被替换。
class B
重新实现foo
,则在vtable
class B
B::foo
中,该条目将为class C
。foo
重新实现vtable
,则在class C
C::foo
class B
中,该条目将为foo
。因此,virtual
不需要将函数virtual
声明为vtable
。
如果函数是watch -n 1 cat /proc/net/wireless
,则在运行时使用使用其对象的相应类的for II in $(seq 1 111);
do
wifisig="grep wlan0 /proc/net/wireless | awk '{ print $3,$4,$5 }'"
echo $wifisig
sleep 1
done
进行解析。
答案 1 :(得分:0)
答案是否定的,B不必重新实现foo()。它继承了A中的函数。注意,如果你创建一个(堆栈分配的)B实例并在其上调用foo()
,那么该函数不会被视为虚拟 - A' s {{1 }} 叫做。
要在派生类中使用函数的重新定义的虚拟版本(利用多态性,请参阅),必须通过指针或对派生类的实例的引用来调用函数。否则将使用对象的静态类型。
foo()