首先,下面的代码不是使用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;
}
答案 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.