【问题标题】:Calling an overridden method from the base class从基类调用重写的方法
【发布时间】:2012-12-12 11:07:32
【问题描述】:
假设我有以下课程:
class A {
public:
virtual void foo() {
bar();
}
protected:
virtual void bar() {
// Do stuff
}
}
class B : public A {
protected:
virtual void bar() {
// Do other stuff
}
}
如果我有一个 B 的实例并调用 foo 方法,会调用哪个 bar 方法?这个编译器是特定的吗?
谢谢
【问题讨论】:
标签:
c++
methods
overriding
【解决方案1】:
如果您有B 的实例,A::foo 将调用B::bar。实例是通过指针引用还是基类引用无关紧要:不管这个,调用B的版本;这就是使 多态 调用成为可能的原因。该行为不是特定于编译器的:虚函数按照标准以这种方式运行。
【解决方案2】:
你不能,但你可以绕过它。在这种情况下,您可以将 true 默认 bool 参数添加到 A 构造函数,并在 B 中将 false 传递给它:
class A
{
public:
A(bool construct = true) {
if (!construct) return;
bar();
}
virtual void bar() { cout << "A::bar" << endl; }
};
class B : public A
{
public:
B() : A(false) { bar(); }
void bar() override { cout << "B::bar" << endl; }
};
int main()
{
A a;
B b;
}
输出:
A::bar
B::bar