在c ++中使用虚函数调用的构造函数

时间:2010-01-03 13:47:18

标签: c++ constructor virtual

首先,下面的代码不是使用visual c ++,而是使用流血

输出为0,但是acc。对我来说它应该是1;任何人都可以解释这个

#include<iostream>
using namespace std;
class shape
{
public:
    virtual void print() const =0;
    virtual double area() { return 0.0;}
};
class point : public shape
{
    int x;
    int y;
public :
    point(int a=11, int b=11)
    {
        x=a;
        shape *s;
        s=this;
        cout<<s->area();
        y=b;
    }
    double area()const {return 1.0;}
    void print() const
    {
        cout<<"\nPoint\n";
        cout<<x<<"\t"<<y;
    }
};

int main()
{   
    point p(1,2);
    return 0;
}

4 个答案:

答案 0 :(得分:3)

您的代码中存在一个微妙的缺陷:

double area()const {return 1.0;}

基类“area()方法未声明const。因此,point :: area不是虚方法。也可以声明shape::area const或从point::area删除const,它将按预期工作。

答案 1 :(得分:2)

从构造函数中调用虚函数是一个非常糟糕的主意。有关详细信息,请参阅此Calling virtual functions from constructor(请参阅第3段)。

答案 2 :(得分:0)

在函数的构造函数中调用虚函数就好像函数不是虚函数一样。它可能令人困惑,但它是c ++中的标准行为

如果你想实现你的目标那么你可能应该有一个“初始化”函数,你可以在虚构函数调用的构造函数之后调用它来按预期工作。

答案 3 :(得分:-2)

你得到了正确的输出。它应该是0。在派生类的构造函数中调用area()时,实际调用area()的基本版本而不是派生版本。在构造函数中调用虚函数不会调用派生类中的重写函数。

阅读this.