【问题标题】:Why my virtual method is not overridden?为什么我的虚拟方法没有被覆盖?
【发布时间】:2017-01-22 22:08:34
【问题描述】:
class Base
{
public:
Base()
{
cout<<"base class"<<endl;
fun();
}
virtual void fun(){cout<<"fun of base"<<endl;}
};

class Derive:public Base
{
public:
Derive()
{
cout<<"derive class"<<endl;
fun();
}
void fun(){ cout<<"fun of derive"<<endl;}
};

void main()
{
Derive d;
}

输出是:

base class
fun of base
derive class
fun of derive

为什么第二行不是fun of derive

【问题讨论】:

标签: c++ overriding


【解决方案1】:

当您在基类构造函数中调用 fun() 时,派生类尚未构造(在 C++ 中,类首先构造父类),因此系统还没有 Derived 的实例,因此没有条目Derived::fun() 的虚函数表。

这就是为什么在构造函数中调用虚函数通常不受欢迎的原因,除非您特别想要调用虚函数的实现,该虚函数要么是当前实例化对象的一部分,要么是某个对象的一部分它的祖先。

【讨论】:

    【解决方案2】:

    因为你是这样写的......你对派生类构造函数的调用是:

    - Base Class Constructor call
       |
       Call to **fun of Base Class**
    - Derived Class Constructor call
       |
       Call to **fun of the Derived Class**
    

    更多详情here

    【讨论】:

    • 基类中的虚方法是否总是被具有相同签名的派生方法覆盖,即使在构造函数中也是如此?
    • 是的,但是 Timo 刚刚给出了答案 :)
    猜你喜欢
    • 2020-04-01
    • 2017-06-28
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2016-01-24
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多