Gal*_*man 50 c++ polymorphism virtual
说我们有:
Class Base
{
virtual void f(){g();};
virtual void g(){//Do some Base related code;}
};
Class Derived : public Base
{
virtual void f(){Base::f();};
virtual void g(){//Do some Derived related code};
};
int main()
{
Base *pBase = new Derived;
pBase->f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
哪个g()会被召唤Base::f()?Base::g()还是Derived::g()?
谢谢...
Joh*_*itb 55
将调用派生类的g.如果要调用基础中的函数,请调用
Base::g();
Run Code Online (Sandbox Code Playgroud)
代替.如果要调用派生版,但仍希望调用基本版本,请安排派生版本的g在其第一个语句中调用基本版本:
virtual void g() {
Base::g();
// some work related to derived
}
Run Code Online (Sandbox Code Playgroud)
在模板方法设计模式中使用这样的事实,即来自基础的函数可以调用虚方法并将控制转移到派生类中.对于C++,它更好地称为非虚拟接口.它在C++标准库中也被广泛使用(例如,C++流缓冲区具有pub...调用实际工作的虚函数的函数.例如pubseekoff调用受保护的seekoff).我在这个答案中写了一个例子:如何验证对象的内部状态?
它是Derived :: g,除非你在Base的构造函数中调用g.因为在构造Derived对象之前调用了Base构造函数,所以Derived :: g无法在逻辑上被调用,因为它可能会操作尚未构造的变量,因此将调用Base :: g.
小智 5
pBase是指向基础的指针.pBase = new Derived返回指向Derived - Derived is-a Base的指针.
所以pBase = new Derived是有效的.
pBase引用了一个Base,因此它将Derived视为Base.
pBase-> f()将调用Derive :: f();
然后我们在代码中看到:
Derive :: f() - > Base :: f() - > g() - 但是哪个g ??
好吧,它调用Derive :: g(),因为这是pBase"指向"的g.
答案:Derive :: g()
| 归档时间: |
|
| 查看次数: |
47478 次 |
| 最近记录: |