也没有在派生类中定义Virtual方法

时间:2017-01-12 04:05:39

标签: inheritance virtual derived

我有以下类层次结构。

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()重新声明为虚拟?

注意:忽略此处和那里的轻微语法错误。这不是实际代码。我的问题只是关于这个概念。

2 个答案:

答案 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()