从基类调用重写的方法
Posted
技术标签:
【中文标题】从基类调用重写的方法【英文标题】: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 方法?这个编译器是特定的吗?
谢谢
【问题讨论】:
【参考方案1】:如果您有B
的实例,A::foo
将调用B::bar
。实例是通过指针引用还是基类引用无关紧要:不管这个,调用B
的版本;这就是使 多态 调用成为可能的原因。该行为不是特定于编译器的:虚函数按照标准以这种方式运行。
【讨论】:
请注意,在基本构造函数和析构函数中,情况并非如此。在那里它将调用基本实现。讨论:cplusplus.com/forum/general/109477【参考方案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
【讨论】:
以上是关于从基类调用重写的方法的主要内容,如果未能解决你的问题,请参考以下文章